虛擬機初始堆狀態(tài) ,為了方便 區(qū)域劃分比較小
from /to 分別占一個單元
eden占8個單元
OldGen 占20個單元
過程忽略代數(shù)計算
所有對象為強引用溢陪,都是不可回收的狀態(tài)
vm_0.jpg
然后開始對象分配 新創(chuàng)建的對象首先分配到Eden 區(qū)域中
直到Eden區(qū)域分配滿
vm_2.png
此時觸發(fā)第一次GC 操作 萍虽,為Eden空間分配不足觸發(fā)的MinorGC
vm_3.png
from區(qū)域現(xiàn)在是空的杉编,所以首先將Eden中的對象向 to中進行分配,分配滿以后 會將其余的對象分配到老年代 OldGen中
vm_4.png
第一次GC 完成后 繼續(xù)向Eden 創(chuàng)建對象 直到再次觸發(fā)MinorGC
vm_5.png
此時首先將From區(qū)域中的元素復制到to區(qū)域(此處忽略的代數(shù)没酣,如果有代數(shù)在默認15代的對象需要晉升到老年代中绒净,并且此處留一個坑,是先計算代數(shù)然后放入to還是先將Eden放入to)偿衰,由于此時To區(qū)域已滿挂疆,所以剩余的對象會放入老年代OldGen中
vm_6.png
繼續(xù)在Eden分配對象
vm_7.png
再次觸發(fā)MinorGC
vm_8.png
可以看到改览,此時 Eden需要晉升的對象數(shù)量要大于老年代的剩余空間,這是會觸發(fā)FullGC 操作來對老年代進行回收操作(此處有第二個坑缤言,F(xiàn)ullGC 時是否會對From區(qū)域再次進行回收宝当,還是直接將from區(qū)域的對象復制到OldGen,看流程FullGC是前面一個MinorGC 觸發(fā)的胆萧,所以理論上 已經(jīng)完成了對From區(qū)域的處理)
接下來有兩種情況:
一:已經(jīng)無法在申請到內存空間庆揩,此時 老年代無法申請空間存放Eden中的元素 拋出OOM
二:jvm可以向系統(tǒng)申請空間擴展,則如下圖進行空間擴展跌穗,然后將Eden晉升對象放入老年代
vm_9.png
vm_10.png