深入JVM內核---GC算法

        GC(Garbage Collection)垃圾收集,即將內存分爲幾個區域,將不同的生命週期的對象放在不同區域裏,在GC收集的時候,頻繁收集生命週期短的區域(young).比較少的收集生命週期較長的區域(old),基本不收集的永久區(perm).1960年List使用了GC,java中,GC的對象是堆空間和永久區,GC的作用是自動檢測對象是否超過作用域從而自動回收內存.防止人爲的引入導致內存的泄露.

GC算法:

       ---標記清除法

       ---標記壓縮法

       ---複製算法

       ---引用計數法


1.標記---清除

        標記---清除算法是現代垃圾回收算法的思想基礎.標記---清除算法將垃圾回收分爲兩個階段:標記階段和清除階段.一種可行的實現是,在標記階段,首先通過根節點,標記所有從根節點開始的可達對象.因此,未被標記的對象就是未被引用的垃圾對象.然後,在清除階段,清除所有爲被標記的對象.




優點:

         解決了循環引用的問題

缺點:

        (1)暫停整個應用

        (2)會產生內存碎片

        (3)不管這個對象是否可達,是否爲垃圾,都要在清除階段被檢查一遍,非常耗時.

2.標記---壓縮

       標記---壓縮算法適合用於存活對象比較多的場合,如老年代.它在標記---清除算法的基礎上做了一些優化.和標記---清除算法一樣,標記---壓縮算法也首先需要從根節點開始,對所有可達對象做一次標記.但之後它並不簡單的清理未標記的對象,而是將所有的存活對象壓縮到內存的一端.之後,清理邊界外所有的空間.




優點:

        (1)避免標記掃描的碎片問題

        (2)避免停止複製的空間問題

缺點:

        同標記---清除法.

3.複製算法

與標記---清除算法相比,複製算法是一種相對高效的回收方法.不適用於存活對象較多的場合 如老年代.

複製算法是將原有的內存空間分爲兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用的內存中的存活對象複製到未使用的內存塊中,之後,清除正在使用的內存塊中的所有對象,交換兩個內存的角色,完成垃圾回收.



優點:

        不會出現碎片問題

缺點:

        (1)暫停整個應用

        (2)需要2倍的內存空間


4.引用計數法

引用計數法的實現很簡單,對於一個對象A,只要有任何一個對象引用了A,則A的引用計數器就加1,當引用失效時,引用計數器就減1.只要對象A的引用計數器的值爲0,則對象A就不可能再被使用.






缺點:

        引用和去引用伴隨加法和減法,影響性能.

         很難處理循環引用.    


分代思想:

依據對象的存活週期進行分類,短命對象歸爲新生代,長命對象歸爲老年代.


young:主要用來存放新生的對象

old:主要存放應用程序中生命週期長的內存對象.

permanent:內存的永久保存區域,主要存放class和meta的信息.class在被load的時候被放到永久保存區域,他和存放instance的堆區域不同,GC不會在主程序運行期對永久保存區域進行清理.所以如果你的APP會load很多class的話,就會出現PermGen space錯誤.在java8中,已經沒有了這個permanent代,只有在HotspotVM中有.

根據不同代的特點,選取合適的收集算法

        少量對象存活,適合複製算法

        大量對象存活,適合標記清理或者標記壓縮

發佈了153 篇原創文章 · 獲贊 588 · 訪問量 75萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章