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

System.gc( ) 的理解

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

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

 

 

 

相关标签: JVM

上一篇: System.gc()

下一篇: System.gc源码分析