實戰Java虛擬機器之三“G1的新生代GC”

來源:互聯網
上載者:User

標籤:java   效能最佳化   jvm   虛擬機器   

今天開始實戰Java虛擬機器之三:“虛擬機器的工作模式”。

總計有5個系列

  • 實戰Java虛擬機器之一“堆溢出處理”
  • 實戰Java虛擬機器之二“虛擬機器的工作模式”
  • 實戰Java虛擬機器之三“G1的新生代GC”
  • 實戰Java虛擬機器之四“禁用System.gc()”
  • 實戰Java虛擬機器之五“開啟JIT編譯”

      新生代GC的主要工作是回收eden區和survivor區。一旦eden區被佔滿,新生代GC就會啟動。新生代GC收集前後的堆資料5.6所示,其中E表示eden區,S表示survivor區,O表示老年代。可以看到,新生代GC只處理eden和survivor區,回收後,所有的eden區都應該被清空,而survivor區會被收集一部分資料,但是應該至少仍然存在一個survivor區,類比其他的新生代收集器,這一點似乎並沒有太大變化。另一個重要的變化是老年代的地區增多,因為部分survivor區或者eden區的對象可能會晉陞到老年代。

圖5.6  G1的新生代GC

新生代GC發生後,如果開啟了PrintGCDetails選項,就可以得到類似以下的GC日誌(這裡只給出了部分日誌,完全的日誌及其分析請看《實戰Java虛擬機器》一書第5.4.6節):

0.336: [GC pause (young), 0.0063051 secs]….   [Eden: 235.0M(235.0M)->0.0B(229.0M) Survivors: 5120.0K->11.0M Heap: 239.2M(400.0M)->10.5M(400.0M)] [Times: user=0.06 sys=0.00, real=0.01 secs]

     和其他回收器的日誌相比,G1的日誌內容非常豐富。當然我們最為關心的依然是GC的停頓時間以及回收情況。從日誌中可以看到,eden區原本佔用235M空間,回收後被清空,survivor區從5M增長到了11M,這是因為部分對象從eden區複製到survivor區,整個堆合計為400M,從回收前的239M下降到10.5M。

實戰Java虛擬機器之一“堆溢出處理”

實戰Java虛擬機器之二“虛擬機器的工作模式”

節選自

實戰Java虛擬機器之三“G1的新生代GC”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.