深入理解JVM學習筆記(二十二、JVM 垃圾回收機制---如何回收垃圾---回收策略【複製演算法】)
阿新 • • 發佈:2019-02-03
上一節我們講到了標記-清除演算法因為需要進行兩次記憶體掃描導致效率不高,那麼這一節我們介紹一種複製演算法,比較好的解決了這個問題。
講複製演算法前,我們先回顧一下JVM的記憶體結構。JVM記憶體大體分為兩大塊,分別為執行緒共享區、執行緒獨佔區。其中執行緒共享區主要包括堆記憶體、方法區。執行緒獨佔區主要包括棧記憶體、本地方法棧、程式計數器。而我們垃圾回收主要針對的是執行緒共享區的堆記憶體。
劃重點,劃重點,劃重點。接下來將是本系列部落格第一次提及JVM的兩個很重要的概念,新生代和老年代。
為了方便垃圾回收,我們的的堆記憶體又分為兩塊區域,新生代
1、剛開始建立的新物件會被放入Eden(伊甸園)。
2、垃圾回收機制被觸發,垃圾回收器掃描Eden(伊甸園)、Survival1(存活區1)中可被回收的物件將其回收。將不可被回收的物件複製到Survival2(存活區2)中。
3、下一次垃圾回收機制被觸發,垃圾回收器掃描Eden(伊甸園)、Survival2(存活區2)中可被回收的物件將其回收。將不可被回收的物件複製到Survival1(存活區1)中。
4、當掃描Survival中物件若還不可被回收則可能將其放入Tenured(終身區)中。
5、以此往復掃描Eden(伊甸園)和Survival中的一個區域。將存活物件放入Survival中另外一個區域中。
思考問題:
倘若我們不可被回收的記憶體超過10%,Survival區域放不下怎麼辦?
答:將年歲最大的記憶體扔進老年代中。