GC Root

                    GC Root算法

       GC Root:常說的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的對象,GC會收集那些不是GC roots且沒有被GC roots引用的對象。ide

    GC Root 引用的對象:this

        1.虛擬機棧中引用的對象spa

        2.方法區中類靜態屬性引用的對象code

        3.方法區常量引用的對象對象

        4.本地方法棧中JNI引用的對象(Native方法)blog

    簡單的用衣服圖來表達一下:虛擬機

        

   留心腳下:class

     判斷一個對象的存活不是有計數器判斷,由於計數器沒法解對象之間的相互循環引用問題,一個對象的存活可使用可達性分析算法來判斷。循環

  可達性分析算法:

    

    

    一次對象自我拯救的演示:

 1 package com.hehe;  2 
 3 public class Main {  4 
 5 
 6     public static Main save = null;  7 
 8     public void isAlive() {  9         System.out.println("yes,i am still alive:)"); 10  } 11 
12  @Override 13     protected void finalize() throws Throwable { 14         super.finalize(); 15         System.out.println("finalize method executed"); 16         Main.save = this; 17  } 18 
19     public static void main(String[] args) throws Throwable { 20         save = new Main(); 21 
22         //對象的第一次拯救
23         save=null; 24  System.gc(); 25         //finalize方法優先級很低,因此暫時等待0.5秒
26         Thread.sleep(500); 27         if (save != null) { 28  save.isAlive(); 29         } else { 30             System.out.println("no , i am dead;("); 31  } 32 
33         //第二次拯救:失敗,由於任何一個對象的finalize方法都只會被系統調用一次
34         save = null; 35  System.gc(); 36         if (save != null) { 37  save.isAlive(); 38         } else { 39             System.out.println("no,i am dead :))"); 40  } 41  } 42 }

運行結果:

     

相關文章
相關標籤/搜索