<JVM高级特性与最佳实践> 笔记--一次对象自我拯救的 演示
说明,是拜读 <JVM高级特性与最佳实践> 以后的笔记而已,基本上只是做一个记录..
package com.taobao.jvm;public class FinalizeEscape {public static FinalizeEscape FC = null;@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize method invoke");FC = this;}public static void main(String[] args) throws Exception {FC = new FinalizeEscape();FC = null;System.gc();Thread.sleep(500);if(FC != null)System.out.println("i am alive");else System.out.println("i am dead");FC = null;System.gc();Thread.sleep(500);if(FC != null)System.out.println("i am alive");else System.out.println("i am dead");}}
?
?
执行的结果是
System.gc();?
这个方法调用JVM的GC不保证一定能执行GC.这个我通过打印GC信息得到验证,至少在这个程序中,gc是保证被执行的.
[GC 317K->224K(60864K), 0.0006300 secs][Full GC 224K->158K(60864K), 0.0040963 secs]finalize method invokei am alive[GC 793K->190K(60864K), 0.0001947 secs][Full GC 190K->158K(60864K), 0.0048994 secs]i am dead
?
4 作者说:finalize方法是JAVA刚诞生的时候对C/C++的一种妥协.所以,忘掉他吧..虽然他能给对象一个最后拯救自己的机会.
1 楼 IcyFenix 2011-07-11 引用这个方法调用JVM的GC不保证一定能执行GC在HotSpot中,调用了System.gc()而不发生GC只有一种情况:设置了-XX:+DisableExplicitGC参数,除此之外,System.gc()是一定能保证触发GC执行的。这个可以通过HotSpot的源码来证明。