1. 程式人生 > >深入理解JVM學習筆記(二十二、JVM 垃圾回收機制---如何回收垃圾---回收策略【複製演算法】)

深入理解JVM學習筆記(二十二、JVM 垃圾回收機制---如何回收垃圾---回收策略【複製演算法】)

        上一節我們講到了標記-清除演算法因為需要進行兩次記憶體掃描導致效率不高,那麼這一節我們介紹一種複製演算法,比較好的解決了這個問題。

       講複製演算法前,我們先回顧一下JVM的記憶體結構。JVM記憶體大體分為兩大塊,分別為執行緒共享區、執行緒獨佔區。其中執行緒共享區主要包括堆記憶體、方法區。執行緒獨佔區主要包括棧記憶體、本地方法棧、程式計數器。而我們垃圾回收主要針對的是執行緒共享區的堆記憶體。

        劃重點,劃重點,劃重點。接下來將是本系列部落格第一次提及JVM的兩個很重要的概念,新生代和老年代。

        為了方便垃圾回收,我們的的堆記憶體又分為兩塊區域,新生代

老年代。為什麼要這麼問,接下來講複製演算法時候會細細道來。那麼新生代又會被分為四塊區域:Eden(伊甸園)[記憶體佔比80%]、Survival1(存活區1)[記憶體佔比10%]、Survival2(存活區2)[記憶體佔比10%]、Tenured(終身區)[擔保記憶體區,額外空間]。那麼問題來了,這四個區域是怎麼和複製演算法完美契合的呢。接下來結合複製演算法的邏輯做以下說明:

        1、剛開始建立的新物件會被放入Eden(伊甸園)。

        2、垃圾回收機制被觸發,垃圾回收器掃描Eden(伊甸園)、Survival1(存活區1)中可被回收的物件將其回收。將不可被回收的物件複製到Survival2(存活區2)中。

        3、下一次垃圾回收機制被觸發,垃圾回收器掃描Eden(伊甸園)、Survival2(存活區2)中可被回收的物件將其回收。將不可被回收的物件複製到Survival1(存活區1)中。

        4、當掃描Survival中物件若還不可被回收則可能將其放入Tenured(終身區)中。

        5、以此往復掃描Eden(伊甸園)和Survival中的一個區域。將存活物件放入Survival中另外一個區域中。

思考問題:

        倘若我們不可被回收的記憶體超過10%,Survival區域放不下怎麼辦?

        答:將年歲最大的記憶體扔進老年代中。