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 }
運行結果: