java垃圾回收中System.gc()的理解

System.gc()无法保证GC一定执行

  • 在默认情况下,通过System.gc()或Runtime.getRuntime()的调用,会显示的触发FullGC,同时对老年代和新生代进行回收,会尝试释放掉被丢弃对象占用的内存
  • JVM实现者可以通过system.gc()调用来决定JVM的GC行为,而一般情况下,垃圾回收应该是自动进行的,无需手动触发,否则就太过于麻烦了。
  • 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上出发GC)

在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.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()");
    }
}

如果注掉System.runFinalization(),那么控制台不保证一定打印,从而证明System.gc()无法保证GC一定执行

猜你喜欢

转载自blog.csdn.net/l2470334493/article/details/108167375
今日推荐