深入瞭解java虛擬機之GC回收機制

用斷點機制來一步一步看虛擬機的變化

先來介紹每個參數的意義

-GC 

參數 含義
S0C Survivor1總空間
S1C Survivor2總空間
S0U Survivor1已用空間
S1C Survivor2已用空間
EC Eden總空間
EU Eden已用空間
OC Old總空間
OU Old已用空間
PC Permanent總空間
PU Permanent已用空間
YGC Young GC次數
YGCT Young GC總時間
FGC Full GC次數
FGCT Full GC總時間
GCT GC總時間,包括Young GC和Full GC

源碼第一步:


查看虛擬機數據:


下一步


虛擬機數據對比,發現Eden多使用了2M


第三步


虛擬機數據對比


第四步:




第五步




第六步,注意了在這裏再分配空間Eden存儲空間就不足了要觸發Young GC了


查看虛擬機數據變化


發現了什麼?

發現了什麼?

發生了第一次Young GC ,Eden內存不夠然後就觸發了Young GC回收了allocation1的內存此時做出整理將Eden與其中一個survivor的內存放入另一個survivor中,但是survivor只有1M內存不夠,這是就會用到老年代的擔保機制,老年代有10M內存足夠於是會將Eden中的對象放入到老年代中於是老年代佔用變成了4M,然後再在Eden中爲新的allocation4分配2M內存,至於S1U中爲什麼會有416kb我也解釋不清楚有知道可不吝賜教,我個人覺得應該是先複製到survivor中複製了一部分發現不足然後轉移到老年代中,於是就出現了S1U中的416了,好了接着看(因爲之前做實驗去了不小心把窗口關掉了,從新接着上面來,只是JVMID改變了一下)



繼續





接下來的三個null虛擬機參數都不會發生改變所以只截一個圖




好了最後一個分配內存又要發生Young GC了Eden內存不足Survivor內存也不足存儲發生Young GC



是吧,發生了第二次Young GC動作跟第一次一樣先做清理工作然後將Eden的東西與其中一個Survivor的東西複製到另一個Survivor,此時發現另一個Survior內存是足夠的,注意了釋放了三個allocation 此時Eden 裏的對象都沒了只剩下了400kb而另一個空的survivor內存有1M是足夠存儲的所以直接將已使用的survivor的東西與Eden的東西複製到另一個空的Survivor中,如此循環往復。


好了介紹了新生代GC那什麼時候觸發Full GC呢?當觸發了一個Young GC時發現survivor內存不足時會想到老年代擔保,但如果此時老年代內存也不足時,就會觸發Full GC了,看下面的例子,注意了,這次把allocation4,5,6賦值爲空取消了




發現了什麼?觸發了Full GC對不對...

好了虛擬機垃圾回收機制在此就講完了,不足的地方還望補充


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章