JVM 垃圾回收GC

一、如何判斷對象是垃圾對象

     1.引用計數法

            在對象中添加一個引用計數器,當有地方引用這個對象的時候,引用計數器的值+1,失效則-1。但是兩個相互引用的對象有可能無法回收。

private Object instance;
Demo demo1 = new Demo();
Demo demo2 = new Demo();
demo1.instance = demo2;
demo2.instance = demo1;
demo2 = null;
demo1 = null;
System.gc();

     2.可達性分析

    根據GCRoots節點來搜索,遍歷過得路徑,當對象不再引用鏈上,則對象可以被回收(沒有被引用)。

    GCRoots對象:

        虛擬機棧、方法去中類屬性引用的對象、方法區中常量引用的對象、本地方法棧中引用的對象。

二、如何回收

     1.回收策略

         (1)標記-清除

               1.標記:標記出需要回收的對象

               2.清除:清除無效的對象       

           缺點:清除對象過程中,將對象內存佔用的內存清空,但不會整理內存空間,這導致內存的地址是不連續的。當需要分配新對象的內存時,需要在內存的一張維護表裏面尋找可用的連續的內存,如果沒有找到則會觸發GC。 這樣會造成效率的浪費和空間內存的浪費。  

         (2)複製

            堆內存分爲 一個eden和兩個survivor區域,內存比例是8:1:1。在未發生GC前,內存中產生的對象存儲在eden區域和一個Survivor區域。當着兩個區域都存滿時,會觸發GC,將存活下來的對象實例存儲到第二個survivor區域。這個區域和eden區域將會作爲新的內存區域來存放新產生的對象。

       (3)標記-整理 (針對老年代回收的算法)

             標記需要清除的對象,將需要清除的對象和保留的對象移動至兩個區域,進而清除對象。這樣的算法可以使得清楚後的內存區域是完整連續的區域。

         (4)分代收集算法

             分代收集算法是根據不用的區域採用不用的算法來進行GC,新生代區域採用複製算法,老年代採用標記-整理算法。這樣的分配規則使得不同區域的GC性能更加高效。

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