GC Root

mac2022-06-30  18

                    GC Root

       GC Root:常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC roots且没有被GC roots引用的对象。

    GC Root 引用的对象:

        1.虚拟机栈中引用的对象

        2.方法区中类静态属性引用的对象

        3.方法区常量引用的对象

        4.本地方法栈中JNI引用的对象(Native方法)

    简单的用衣服图来表达一下:

        

   留心脚下:

     判断一个对象的存活不是有计数器判断,因为计数器无法解对象之间的相互循环引用问题,一个对象的存活可以使用可达性分析算法来判断。

  可达性分析算法:

    

    

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

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 }

运行结果:

     

 

转载于:https://www.cnblogs.com/meiLinYa/p/9103248.html

最新回复(0)