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 }
运行结果: