JVM垃圾回收機制

JVM垃圾回收機制


垃圾回收(Garbage Collection,GC):自動清空堆中不再使用的對象。

如果一個對象沒有引用,我們稱這個對象不可達,垃圾回收用於釋放不可達的對象所佔據的內存,這是垃圾回收的基本原則。

     垃圾回收分爲兩個步驟:判斷這個對象是否已死(不可達)清除這個對象

1、對象已死嗎

     引用計數。給對象添加一個計數引用器,當爲0時,判斷對象不可達。缺點:無法解決相互引用的情況。如果有兩個對象循環引用(cyclic reference),比如兩個對象互相引用,而且此時沒有其它(指向A或者指向B)的引用,我們實際上根本無法通過引用到達這兩個對象。ObjA.instance = ObjB;   ObjB.instance = ObjA;    ObjA和ObjB已經不能訪問,但引用計數法無法通知垃圾回收機制。

改進:因此,我們以棧和static數據爲根(root),從根出發,跟隨所有的引用,就可以找到所有的可到達對象。也就是說,一個可到達對象,一定被根引用,或者被其他可到達對象引用。

                                               

 2、垃圾回收策略

      VM的垃圾回收是多種機制的混合。JVM會根據程序運行狀況,自行決定採用哪種垃圾回收。

我們先來了解"mark and sweep"。這種機制下,每個對象將有標記信息,用於表示該對象是否可到達。當垃圾回收啓動時,Java程序暫停運行。JVM從根出發,找到所有的可到達對象,並標記(mark)。隨後,JVM需要掃描整個堆,找到剩餘的對象,並清空這些對象所佔據的內存。


        另一種是"copy and sweep"。這種機制下,堆被分爲兩個區域。對象總存活於兩個區域中的一個。當垃圾回收啓動時,Java程序暫停運行。JVM從根出發,找到可到達對象,將可到達對象複製到空白區域中並緊密排列,修改由於對象移動所造成的引用地址的變化。最後,直接清空對象原先存活的整個區域,使其成爲新的空白區域。


    可以看到,"copy and sweep"需要更加複雜的操作,但也讓對象可以緊密排列,避免"mark and sweep"中可能出現的空隙。在新建對象時,"copy and sweep"可以提供大塊的連續空間。因此,如果對象都比較"長壽",那麼適用於"mark and sweep"。如果對象的"新陳代謝"比較活躍,那麼適用於"copy and sweep"。 

        上面兩種機制是通過分代回收(generational collection)混合在一起的。每個對象記錄有它的世代(generation)信息。所謂的世代,是指該對象所經歷的垃圾回收的次數。世代越久遠的對象,在內存中存活的時間越久。

      根據對Java程序的統計觀察,世代越久的對象,越不可能被垃圾回收(富人越富,窮人越窮)。因此,當我們在垃圾回收時,要更多關注那些年輕的對象。 

現在,具體看一下JVM中的堆:

                                         

      我們看到,堆分爲三代。其中的永久世代(permanent generation)中存活的是Class對象。這些對象不會被垃圾回收。我們在RTTI中已經瞭解到,每個Class對象代表一個類,包含有類相關的數據與方法,並提供類定義的代碼。每個對象在創建時,都要參照相應的Class對象。每個對象都包含有指向其對應Class對象的引用。

       年輕世代(young generation)和成熟世代(tenured generation)需要進行垃圾回收。年輕世代中的對象世代較近,而成熟世代中的對象世代較久。

年輕世代進一步分爲三個區域:

eden(伊甸): 新生對象存活於該區域。新生對象指從上次GC後新建的對象

from, to: 這兩個區域大小相等,相當於copy and sweep中的兩個區域

       當新建對象無法放入eden區時,將出發minor collection。JVM採用copy and sweep的策略,將eden區與from區的可到達對象複製到to區。經過一次垃圾回收,eden區和from區清空,to區中則緊密的存放着存活對象。隨後,from區成爲新的to區, to區成爲新的from區。

      如果進行minor collection的時候,發現to區放不下,則將部分對象放入成熟世代。另一方面,即使to區沒有滿,JVM依然會移動世代足夠久遠的對象到成熟世代。

       如果成熟世代放滿對象,無法移入新的對象,那麼將觸發major collection。JVM採用mark and sweep的策略,對成熟世代進行垃圾回收


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章