垃圾回收


#Java 笔记


触发垃圾回收

使用 System.gc() 可以用来建议 JVM 进行垃圾回收,但不保证回收时间以及是否会回收。JVM 会判断是否有回收的必要性。

在 Oracle Java 8 默认配置下,下面的代码,在一些场景下,能有效触发 gc:

System.gc();  // 建议 JVM 进行 gc 操作,但不一定会进行 gc 操作
System.runFinalization();  // 执行将要被销毁的对象的 finalize 方法

不保证一定触发。

finalize 方法

如果一个类实现了 finalize 方法,那么当类生成的对象要被垃圾回收时,会先执行该方法。

示例:

public class FinalizeTest {

    static  class Person {
        String name;

        @Override
        protected void finalize() throws Throwable {
            System.out.println("finalize " + name);
            super.finalize();
        }
    }


    public static void main(String[] args) {
        Person p = new Person();
        p.name = "ltt";
        p = null;  // 此后,p原先指向的Person对象会在某个时间被 gc 回收掉

        System.gc();  // 建议 JVM 进行 gc 操作,但不一定会进行 gc 操作
        System.runFinalization();  // 执行将要被销毁的对象的 finalize 方法
    }
}

运行结果:

finalize ltt

为了触发 gc行为,用了下面的代码:

System.gc();  // 建议 JVM 进行 gc 操作,但不一定会进行 gc 操作
System.runFinalization();  // 执行将要被销毁的对象的 finalize 方法

这个代码不保证一定会触发 gc 操作,但在这个示例中是有用的。

如果去掉这两行,Person 的 finalize 不会被触发。可能是因为进行结束可以直接清理内存,所以就不 gc 了。



( 本文完 )