日期:2014-05-20  浏览次数:20698 次

关于System.gc()
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();//第二次执行标记
    }