- Java code
public class TestFinalize { public static void main(String[] args) { TestFinalize2 tf = new TestFinalize2(); tf.change(); new TestFinalize2(); System.gc(); }}class TestFinalize2 { private boolean b = false; TestFinalize2() { b = true; } void change() { b = false; } protected void finalize() { if (b) System.out.println("000"); }}
为什么不是每次都会输出000
------解决方案--------------------
我前几天才看的 不是很懂 但有一点你虽然条用了 gc()但系统并不一定给你处理
处理是不确定性的 必须是不可恢复才清理
------解决方案--------------------
System.gc只是让JVM尽力去运行GC,但其实JVM可以忽略这个建议,runFinalizeOnExit(true)一定会让JVM退出之前执行finalize方法,不过已经deprecated了,System.gc貌似在实际开发几乎不用,因为有可能你的JVM的GC算法在GC的时候会“stop the world”会影响效率,还是让JVM自己管理内存吧
------解决方案--------------------
更正一下这样修改main()方法:
- Java code
public static void main(String[] args) { new TestFinalize2();//没有引用链接到此对象 System.gc();//第一次标记,发现对象没有引用,把此对象加入F-Queue中 try { Thread.sleep(500);//让主线程停止0.5秒,因为Finalizer方法优先级低 } catch (InterruptedException e) { } System.gc();//第二次执行标记 }