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