读书人

lt;JVM高级特性与最佳实践gt; 笔记-一次对

发布时间: 2012-11-01 11:11:32 作者: rapoo

<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的源码来证明。

读书人网 >编程

热点推荐