Java垃圾回收_過程觀察

這是今天看JVM垃圾回收的時候做的實驗觀察。

  1. 使用工具:Java VisualVM、VisualVM GC插件
  2. 觀察應用:Tomcat容器中的Web服務

1. Java VisualVM

在tomcat服務啓動過程中,內存展示的“鋸齒”模式(如圖1所示),表示對象被分配到“伊甸園(Eden區)”中,然執行“年輕代垃圾收集”;每次年輕代收集之後,被佔用的內存量回落到基線水平。


Tomcat服務啓動

圖1

在Tomcat服務運行過程中,堆內存表現爲“使用內存”逐漸增長,到達最大值(接近)時,會進行垃圾收集(如圖2所示),然後堆內存使用回到基線水準。基線水平(藍色)是終身制對象和倖存者對象合起來的用量。如果基線水準保持平穩或者逐漸下行,則說明內存使用良好;如果基線水平上升,未必是程序中有錯誤,也可能是有些對象的生命週期長,足夠進入Old區。

tomcat服務運行過程

圖2

2. VisualVM GC

通過觀察Tomcat應用服務的運行,可以看到Eden(伊甸園)中的空間逐漸不夠用,然後經歷一次年輕代收集:年輕代收集過後,伊甸園空間和收集前的s0中(如圖3所示)的對象被回收;在上述兩個空間中倖存下來的對象存放在s1中,如圖4所示。

這裏寫圖片描述

圖3

執行過一次年輕代回收之後的結果如下所示:

這裏寫圖片描述

圖4

3. 補充概念

  1. 年輕代收集:針對Eden和倖存者區域中的對象執行“標記&清除”算法,會有一部分沒有被清除的對象,遺留下來存放到另一個倖存者區域中;
  2. 何時將對象放入Old區域:(1)經過多次(達到閾值)都倖存下來的對象,則進入Old區域;(2)年輕代回收的時候發現倖存者區域滿了。

參考資料

  1. JVM中的G1垃圾回收器
  2. 《Java程序員修煉之道》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章