System.gc( ) 的理解

System.gc( ) 的理解

  • 在默情况下,通过System.gc( )或者Runtime.getRuntime( ).gc( )的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存
  • 然而System.gc( ) 调用附带一个免责声明,无法保证堆垃圾收集器的调用。
  • JVM实现着可以通过System.gc( )  调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无需手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc( ) 。

通俗解释:

第二点里面的 "System.gc( ) 调用附带一个免责声明,无法保证堆垃圾收集器的调用" 是什么意思?

假设你买了个生日蛋糕,蛋糕盒子上写着免责声明 "请勿将盒子倒置,否则后果自负"。如果你把盒子倒过来了,蛋糕就不好吃了,那别怪我哟。System.gc( ) 这行代码写了,只是告诉JVM将要调用垃圾收集器,结果JVM调没用,怪JVM咯。也可能调用了。

如下代码,如果没有System.runFinalization();  只有System.gc( ), 那么可能要多调用几次main函数,才会触发垃圾收集器,方法才会被调用。

package package0;

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()");
    }
}

猜你喜欢

转载自blog.csdn.net/Xeon_CC/article/details/109076253