1. 程式人生 > >深入理解java虛擬機器---java記憶體區域與記憶體溢位異常---3垃圾回收機制GC

深入理解java虛擬機器---java記憶體區域與記憶體溢位異常---3垃圾回收機制GC

 

一、垃圾回收---物件存活演算法:

    1、引用計數器法:在物件身上放上一個計數器,當有引用則加一,引用失效則減一,為零則可回收。(無法解決物件相互引用)

    2、可達性分析法(java),GC roots為起始點,從節點向下搜尋,搜尋路徑為引用鏈,不在引用鏈的物件則是可回收的物件。

      在Java語言裡,可作為GC Roots物件的包括如下幾種: 

        a.虛擬機器棧(棧楨中的本地變量表)中的引用的物件 
        b.方法區中的類靜態屬性引用的物件 
        c.方法區中的常量引用的物件 
        d.本地方法棧中JNI(native方法)的引用的物件

      就算被Gc標記可回收,也未必死亡,第二次標記則死亡,在第二次標記途中,只要觸發了物件的finalize()方法則可不用被回收,這個方法一個物件只能觸發一次。

      永久代也可被回收

 

二、四種引用型別:

  1.強引用。對形如Object obj = new Object()產生的引用都是都是強引用,只要強引用還存在,jvm就永遠不會回收該物件

  2.軟引用。軟引用主要用來指向一些有用但不重要的物件。如果記憶體足夠,jvm不會回收軟引用指向的物件,如果記憶體緊張,在發生溢位錯誤之前,jvm會回收該物件。

  3.弱引用:弱引用也是用來描述非必需物件的,但是它的強度比軟引用更弱一些,被弱引用關聯的物件只能生存到下一次垃圾收集發生之前。

  4.虛引用也稱為幽靈引用或者幻影引用。它是最弱的一種引用關係。一個物件是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個物件例項。為一個物件設定虛引用關聯的唯一目的就是能在這個物件被收集器回收時收到一個系統通知。在JDK 1.2之後,提供了PhantomReference類來實現虛引用

  

 

三、垃圾回收---物件收集演算法:

  1、標記清楚演算法(1、標記清除效率不高,2、產生大量不連續空間)

 

  2、複製演算法:將記憶體劃分為大小相等的兩塊,每次只使用其中的一塊。當這塊記憶體用完了,就將還存活的物件複製到另一塊記憶體上,然後把已使用過的記憶體空間一次清理掉。

    優點:每次只對其中一塊進行GC,不用考慮記憶體碎片的問題,並且實現簡單,執行高效

    缺點:記憶體縮小了一半

  

  3、標記-整理演算法:複製演算法不適用年老代的存活情況,存活率高時候需要進行較多的複製操作。讓所有存活物件都向一端移動,然後直接清理掉端邊界以外的所有記憶體。

  

   4、分代收集演算法:根據物件的存活週期的不同將記憶體劃分為幾塊,一般就分為新生代和老年代,根據各個年代的特點採用不同的收集演算法。新生代(少量存活)用複製演算法,老年代(物件存活率高)“標記-清理”演算法