用斷點機制來一步一步看虛擬機的變化
先來介紹每個參數的意義
-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對不對...
好了虛擬機垃圾回收機制在此就講完了,不足的地方還望補充