package com.mousycoder.mycode.thinking_in_jvm;
/**
* 对象的复活
*
* @version 1.0
* @author: mousycoder
* @date: 2019-07-06 15:32
*/
public class CanReliveObj {
public static CanReliveObj obj;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("CanReliveObj finalize called");
obj = this;
}
@Override
public String toString() {
return "I am CanReliveObj";
}
public static void main(String[] args) throws InterruptedException {
obj = new CanReliveObj();
obj = null;
System.gc();
Thread.sleep(1000);
if (obj == null) {
System.out.println("obj 是null");
}else {
System.out.println("obj 可用");
}
System.out.println("第 2 次 gc");
obj = null;
System.gc();
Thread.sleep(1000);
if (obj == null) {
System.out.println("obj 是 null");
}else {
System.out.println("obj 可用");
}
}
}
输出:
CanReliveObj finalize called obj 可用 第 2 次 gc obj 是 null
说明:
第一次 GC 的时候,finalize()方法中被复活了,对象状态变成可触及性,但是 finalize() 方法只会被调用一遍,所以第二次没办法复活 就为 null