Java堆內存中為什么有兩個survival區及為什么與年輕代比例是1:1:8?


  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區的話,會直接進入老年代!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM