public class FinalizeTest { public static FinalizeTest obj = null; public static void main(String[] args) throws Exception { obj = new FinalizeTest(); obj = null; // 这两句保证进行垃圾回收标记, finalize能进行挽救自己 System.gc(); //因为finalize方法优先级很低,所以暂停1秒等待它 Thread.sleep(1000); if (obj == null) { System.out.println("obj 死亡1"); } else { // 这里被执行,成功挽救自己 System.out.println("obj 存活1"); } // 一样的的代码 obj = null; System.gc(); //因为finalize方法优先级很低,所以暂停1秒等待它 Thread.sleep(1000); if (obj == null) { // 这里被执行, 无法挽救,finalize只能执行一次 System.out.println("obj 死亡2"); } else { System.out.println("obj 存活2"); } Thread.sleep(1000000000); } @Override protected void finalize() throws Throwable { super.finalize(); obj = this; System.out.println("触发 finalize"); }}
关于:Object对象的finalize()方法
- 调用finalize()方法的时机:当JVM确定不再有指向该对象的引用时,垃圾收集器在对象上调用该方法。
- finalize()方法的作用:JVM调用该方法,表示该对象即将死亡,之后JVM就可以回收该对象了。有点类似对象声明周期的临终方法。
- 通过使用finalize方法可以实现对象的自我拯救,但是只能拯救一次。
- 打开jvisualvm查看Finalizer线程。