Java堆內存分為年輕代和老年代,其中,年輕代分為Eden區和survival區,survival又分為fromSurvival和toSurvival。
首先第一個問題:為什么要有Survival區?因為如果沒有Survival區,Eden每進行一次MinorGC,存活對象送到老年代,當老年代被填滿就會觸發MajorGC,消耗大量時間。當有Survival區后,存活對象可以先被放到此處做一個緩沖,只有經過16次篩選還存活的對象才被移送到老年代,減少MajorGC的發生。
第二個問題:為什么設置兩個Survival區?因為第一次MinorGC后,Survival就會存在一些存活對象,第二次MinorGC后,Eden區的存活對象會放入Survival區,就會與Survival區之前的對象內存不連續,形成內存碎片,時間一長就會影響性能,因此需要兩個Survival區,第一次MinorGC時,Eden區的存活對象轉移到fromSurvival區,Eden清空,第二次MinorGC時,將Eden和fromSurvival區中存活對象轉移到toSurvival,Eden和fromSurvival清空。fromSurvival和toSurvival交換角色,循環往復16次后,再傳向老年代。
tip:當對象超過Eden區的話,會直接進入老年代!!