這是今天看JVM垃圾回收的時候做的實驗觀察。
- 使用工具:Java VisualVM、VisualVM GC插件
- 觀察應用:Tomcat容器中的Web服務
1. Java VisualVM
在tomcat服務啓動過程中,內存展示的“鋸齒”模式(如圖1所示),表示對象被分配到“伊甸園(Eden區)”中,然執行“年輕代垃圾收集”;每次年輕代收集之後,被佔用的內存量回落到基線水平。
圖1
在Tomcat服務運行過程中,堆內存表現爲“使用內存”逐漸增長,到達最大值(接近)時,會進行垃圾收集(如圖2所示),然後堆內存使用回到基線水準。基線水平(藍色)是終身制對象和倖存者對象合起來的用量。如果基線水準保持平穩或者逐漸下行,則說明內存使用良好;如果基線水平上升,未必是程序中有錯誤,也可能是有些對象的生命週期長,足夠進入Old區。
圖2
2. VisualVM GC
通過觀察Tomcat應用服務的運行,可以看到Eden(伊甸園)中的空間逐漸不夠用,然後經歷一次年輕代收集:年輕代收集過後,伊甸園空間和收集前的s0中(如圖3所示)的對象被回收;在上述兩個空間中倖存下來的對象存放在s1中,如圖4所示。
圖3
執行過一次年輕代回收之後的結果如下所示:
圖4
3. 補充概念
- 年輕代收集:針對Eden和倖存者區域中的對象執行“標記&清除”算法,會有一部分沒有被清除的對象,遺留下來存放到另一個倖存者區域中;
- 何時將對象放入Old區域:(1)經過多次(達到閾值)都倖存下來的對象,則進入Old區域;(2)年輕代回收的時候發現倖存者區域滿了。