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方法
下一篇: System.gc( )的理解