GC问题排查实战三-Parallel Scavenge和Parallel Old日志分析

年轻代GC的耗时问题

本篇开始一些比较细节的东西,不想说哪个垃圾回收器最好,没有最好,只有最合适以及根据不同情况调优,只想看看年轻代垃圾收集到底耗时耗在哪里,以便于出现问题的时候有解决思路,本次会用相同的例子压测,然后分别用Parallel Scavenge和Parallel Old,CMS,G1来进行垃圾回收,分析年轻代的一些耗时问题。

Parallel Scavenge和Parallel Old

参数

-Xms8192M -Xmx8192M -Xmn4096M -Xss1M -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -XX:+PrintReferenceGC -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:MetaspaceSize=256M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/app/log/gc/gc.log -XX:ErrorFile=/data/log/error/error.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/heap/heap_hprof.bin -Dfile.encoding=UTF-8

跑完后数据

在这里插入图片描述

gc日志数据

发现有耗时比较大的几次:
在这里插入图片描述

于是选第一次看看:
在这里插入图片描述
然后看了下日志,其中处理final引用对象用了48毫秒,然后发现有32K对象晋升,以及44%的对象经过复制到了to区,消耗应该在这些地方:
在这里插入图片描述
然后我们看第二次:
在这里插入图片描述
看看日志,发现也有56K对象晋升,也有50%复制,但是处理final引用的时间少了,所以时间稍微少了点:
在这里插入图片描述
我们再看后面一个看看是不是这些原因导致的时间久:
在这里插入图片描述
然后是日志,这次晋升的值有8K对象,49%的复制,但是所有的引用处理耗时很少了,所以这次时间花的少:
在这里插入图片描述
再看后面的这个,貌似复制的比前面少,为什么耗时比他多,以为可以看到晋升的多了
130M+
,也是要复制都老年代的,耗时呀
在这里插入图片描述

那我们找个耗时少的分析下,这次晋升还挺多,但是复制只有4%,引用处理几乎没怎么耗时,时间消耗少了好多:
在这里插入图片描述
再看下一个耗时很少的,验证下上面的结论:
在这里插入图片描述

safepoint相关数据

当然STW的时间也可能是因为safepoint的处理,为此我也打印了相关的耗时,可以看到基本都是vmop的耗时,也就是进行GCSTW,如果是有线程因为safepoint等待耗时的话spinsync的大量耗时就会出现,目前暂时没有:
在这里插入图片描述

晋升问题

为什么出现了晋升,好奇怪啊,没看到年龄到15呀,其实我们可以仔细看年龄信息,蓝色框的,其实他此刻的晋升阈值是2,说明有进行动态年龄处理了,把年龄是2的都晋升过去了,然后把阈值改为了2,具体的晋升逻辑是后面会说,是因为动态年龄调节机制:
在这里插入图片描述
暂时分析到这里,当然后面还有另外2个垃圾回收器的测试数据,后一篇说。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值