JVM 垃圾回收日志分析

目录

简介

没有垃圾回收时 堆的情况

添加 一个7MB的对象

添加 一个8MB的对象

添加 一个7MB的对象 + 一个1MB的对象


简介

JVM 垃圾回收就是JVM中有一些线程用来处理 程序运行过程中 堆内存不够的情况,堆内存不够,就把一些不用的堆上的对象清除腾出空间容纳新对象。

所以JVM 垃圾回收就需要判断哪些对象是垃圾,采用哪种策略去回收这些垃圾,回收的时候还需要注意停顿时间,不要对正常的线程运行造成明显的影响。

如果最后发现在怎么清理也没有办法容纳新对象,那么就OOM

没有垃圾回收时 堆的情况

public class Demo2_1_My {
    private static final int _512KB = 512 * 1024;
    private static final int _1MB = 1024 * 1024;
    private static final int _6MB = 6 * 1024 * 1024;
    private static final int _7MB = 7 * 1024 * 1024;
    private static final int _8MB = 8 * 1024 * 1024;

    // -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -XX:-ScavengeBeforeFullGC
    public static void main(String[] args) throws InterruptedException {

    }
}

配置 VM options为

 -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc 

 使用的是串行的垃圾回收器。

堆大小为20M 新生代大小为10M

 

添加 一个7MB的对象

 在此基础上添加 一个7MB的对象 应该会超过9MB,会触发垃圾回收,如果回收完毕还能容纳7MB对象,那么就会分配。

 

添加 一个8MB的对象

在此基础上添加 一个8MB的对象 应该也会超过9MB,应该会触发垃圾回收,但实际没有触发,原因是大对象直接进入老年代

也可以配置参数设定直接进入老年代的阈值():(仅适用于Serial和ParNew两款新生代收集器)

-XX:PretenureSizeThreshold=5M

 超过5MB 直接进入老年代。

原因:

a. 大对象需要连续的内存空间,而新生代为了安放大对象可能需要多次进行GC,增加开销;

b. 新生代种伊甸园区和幸存者区常采用复制算法,需要经常复制对象到不同的区域,而大对象在复制时开销较大。
 

添加 一个7MB的对象 + 一个1MB的对象

7MB的年龄是1,在第二次垃圾回收的时候就进入了老年代,原因是:

如果在Survivor空间中相同年龄所有对象大小的总和大于 Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX: MaxTenuringThreshold中要求的年龄。

 

 参考:

JVM中对象进入老年代的3种情况_轨.迹的博客-CSDN博客_大对象直接进入老年代

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值