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()");
}
}
上一篇: System.gc()
下一篇: System.gc源码分析