欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

System.gc() 的理解

程序员文章站 2022-04-18 19:27:14
...

一 点睛

在默认情况下,通过 system.gc() 或者 Runtime.getRuntime().gc() 的调用,会显式触发 FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。

然而 system.gc() 调用附带一个免责声明,无法保证对垃圾收集器的调用。不能确保立即生效。

JVM 实现者可以通过 system.gc() 调用来决定 JVM 的 GC 行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用 System.gc()。

二 实战——是否触发 GC 操作

1 代码

/**
* 是否触发 GC 操作
*/
public class SystemGCTest {
    public static void main(String[] args) {
        new SystemGCTest();
        System.gc(); // 提醒 JVM 的垃圾回收器执行 GC,但是不确定是否马上执行 GC
        // 与 Runtime.getRuntime().gc();的作用一样。
        // System.runFinalization(); // 强制调用失去引用的对象的 finalize() 方法
    }


    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("SystemGCTest 重写了finalize()");
    }
}

2 不加 System.runFinalization() 测试

从运行结果来看,不一定会触发销毁的方法。

3 加上 System.runFinalization() 测试

但如果调用 System.runFinalization(),则会强制调用失去引用对象的 finalize()。

SystemGCTest 执行了 finalize方法

相关标签: JVM JVM