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 }

运行结果:

     

相关文章
相关标签/搜索