JVM垃圾回收相关概念

本文深入探讨了JVM的垃圾回收,包括System.gc()的理解,内存溢出与内存泄漏的区分,Stop The World现象,以及并发与并行垃圾回收的区别。强调了手动触发GC的不确定性,内存溢出的常见原因,以及如何避免内存泄漏。此外,还介绍了安全点与安全区域的概念,用于确保GC过程中的线程安全性。
摘要由CSDN通过智能技术生成


System.gc()的理解

  • 在默认情况下,通过System.gc()或者是Runtime.gc()的调用,会显示的触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象的内存;
  • 但是System.gc()调用附带有一个免责声明,也就是说即使调用了System.gc()也无法保证对垃圾收集器的调用(也就是无法保证立即触发GC);
  • JVM的实现者可以通过System.gc()调用来决定JVM的GC行为,而一般情况下,垃圾回收应该是自动的,无需手动实现的,否则就太过于麻烦了,但是在一些特殊的情况下,比如我们正在编写一个性能基准,我们可以在运行之间调用System.gc();
  • 以下代码如果注释掉System.runFinalization(),那么控制台就不一定会输出相关的内容,这也证明了System.gc()无法保证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()");
    }
}

手动GC理解不可达对象的回收行为

public class LocalVarGC {
   
    public void localvarGC1() {
   
        byte[] buffer = new byte[10 * 1024 * 1024];//10MB
        System.gc();
        //输出: 不会被回收, 因为引用仍然存在, FullGC时被放入老年代
        //[GC (System.gc()) [PSYoungGen: 14174K->10736K(76288K)] 14174K->10788K(251392K), 0.0089741 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
        //[Full GC (System.gc()) [PSYoungGen: 10736K->0K(76288K)] [ParOldGen: 52K->10649K(175104K)] 10788K->10649K(251392K), [Metaspace: 3253K->3253K(1056768K)], 0.0074098 secs] [Times: user=0.01 sys=0.02, real=0.01 secs]
    }

    public void localvarGC2() {
   
        byte[] buffer = new byte[10 * 1024 * 1024];
        buffer = null;
        System.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值