JVM垃圾回收不要手动System.gc的真正原因

上一篇 << 下一篇 >>>JVM垃圾回收引用计数法和根搜索算法图解


垃圾回收机制

a.垃圾回收是由垃圾收集器自动执行
b.程序员只能通过System.gc方法来建议执行,无法确保是否执行和何时执行。
c.jvm调优无法提高程序的运行效率,它真正的目的是减少GC回收的次数,让系统更多的时间是去处理用户的请求

核心思想:堆内存中对象没有任何引用

finalize方法作用

finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。
它是Object类中的,所有子方法均可以覆盖。
但垃圾回收的时候注意finalize必须是跟着对应的对象。

//1. 直接用new对象,未复制变量时,则调用System.gc()可能会执行垃圾回收,finalize()内容也可能会执行
new FinalizeTest2();
System.gc();

//2. 复制给变量后,就算调用了System.gc(),finalize()内容也肯定不会执行
FinalizeTest2 fs = new FinalizeTest2();
System.gc();

// 3.当引用对象置为空的时候,调用System.gc()可能会执行垃圾回收,但加了System.runFinalization();就一定会执行
FinalizeTest2 fs = new FinalizeTest2();
fs = null;
System.gc();
System.runFinalization();

@Override
public void finalize(){
    System.out.println("垃圾清理前的操作");
}
public static void main(String[] args){
    //这里要用new FinalizeTest();要不然finalize无法执行到,因为finalize是属于FinalizeTest类的
    Object obj = new Object();
//        FinalizeTest obj = new FinalizeTest();
    obj = null;
    System.gc();
}
@Override
public void finalize(){
    System.out.println("垃圾清理前的操作");
}

相关文章链接:
<< << << << <<<自定义SPI和热部署技术破坏类加载器的双亲委派模式
<< << << << <<<服务器CPU飙升为100%问题排查及如何避免
<< << << << << << <<<一张图看懂CMS垃圾回收器的底层原理
<< << << << << <<

你可能感兴趣的:(JVM垃圾回收不要手动System.gc的真正原因)