性能文章>记一次使用VJMap排查频繁YGC的经历>

记一次使用VJMap排查频繁YGC的经历原创

9月前
419403

VJMap概述

分代版的jmap(新生代,存活区,老生代),是排查内存缓慢泄露,老生代增长过快原因的利器。因为jmap -histo PID 打印的是整个Heap的对象统计信息,而为了定位上面的问题,我们需要专门查看OldGen对象,和Survivor区大龄对象的工具。

注意事项

  • 只支持CMS和ParallelGC,不支持G1。
  • vjmap在执行过程中,会完全停止应用一段时间,必须摘流量执行!!!!
  • vjmap使用的java为JAVA_HOME/bin/java, 需要至少JDK7,且与目标应用的JVM使用相同的JDK大版本。
  • vjmap需要依赖JAVA_HOME/lib/sa-jdi.jar
  • 需要root权限 (sudo -E vjmap.sh …,),权限与jmap -heap pid相同.如果无法联通进程时,可尝试执行jstack -F pid, jmap -heap pid 自行比对。如果在容器中运行,需要打开ptrace权限。

频繁YGC排查实践

现在有一个目标进程,一直在频繁的ygc,我们尝试使用VJmap来排查具体的问题原因,现象如下所示。
1.png

1.借助XPocket来使用VJMap

2.png

2.查看年轻代的内存使用情况,使用vjmap -sur PID以及vjmap -all PID来一起排查

多次查看sur区的占用情况,如下所示。
3.png

多次查看整个堆内存以及分代统计后的内存占用情况,如下所示
4.png

2.分析结论

根据VJMap,我们很容易就能注意到一个异常情况,一直存在char数组的内存分配,不管是否存在问题,我们可以带着疑问来进行进一步的分析

3.结合PerfMa的HeapDump社区产品进行dump文件分析

3.1 使用jmap -dump:format=b,file=fileName pid 的方式dump目标进程,得到dump文件。

3.2 将dump文件上传至社区产品Xelephant进行离线分析,得出结果,我们可以很直观的看见,在对象视图中,char数组的自身大小明显存在异常,如下图所示。
5.png

3.3 查看对象被引用,得出char数组在哪一个对象内进行分配,如下图所示。
6.png

3.4 查看源码,即可很直观的发现问题,程序内存在频繁分配对象的情况,存在一个死循环在不断的分配对象,对象内部又会分配一个char数组,至此,问题根源已经付出水面,如下图所示。
7.png
8.png

4.官方最佳实践

https://mp.weixin.qq.com/s/6cJ5JuEgEWmMBzJFBDsSMg

请先登录,再评论

暂无回复,快来写下第一个回复吧~

为你推荐

国内酒店:通过架构改进,我们计划优化掉300+台服务器
背景 线上问题回顾2019年8月某天,那时我刚入职还不到一个月,遇到一个特殊的线上问题:某报价应用个别机器连续FGC不停(准确的说是FGC几乎没任何效果),这些机器重启后不久继续开始不停的FGC。当时
第一次FullGC优化实战
关于FullGC,博主只是在一些书中或者博客中,看别人调优过,今天兴起,亲自在本地调了一把本地的项目:第一步:我首先打开了jvisualvm.exe,在Visual GC 里面发现了今天要讨论的重点:
一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程
通过这一个多月的努力,将FullGC从40次/天优化到近10天才触发一次,而且YoungGC的时间也减少了一半以上,这么大的优化,有必要记录一下中间的调优过程。对于JVM垃圾回收,之前一直都是处于理论
线上服务的FGC问题排查,看这篇就够了!
这篇文章以一个Full GC频繁的线上案例作为引子,详细介绍GC的排查过程,另外会结合GC的运行原理给出一份实践指南。内容分成3个部分:从一次Full GC频繁的线上案例说起、GC的运行原理介绍、排查Full GC问题的实践指南
大量生成字节码导致元空间溢出问题排查
前几天生产环境出现了一个问题,gc日志里面某一个时间段出现了大量的Full GC,而且都是回收元空间内存失败了,最终导致了JVM停止运行,微服务中的某个服务发生了宕机。下面记录下排查该问题的过程。首先
XPocket插件中心|JStack_X、Top_X插件上新,欢迎下载使用
为了给你带来更好的产品体验,请认真填写这份问卷:[XPocket插件中心调研问卷](XPocket插件中心调研问卷)你最想要我们在XPocket插件中心上新哪些插件?请在评论区留言、或填写问卷、或可以
记一次使用VJMap排查频繁YGC的经历
VJMap概述分代版的jmap(新生代,存活区,老生代),是排查内存缓慢泄露,老生代增长过快原因的利器。因为jmap -histo PID 打印的是整个Heap的对象统计信息,而为了定位上面的问题,我
HeapDump性能社区Full GC异常问题排查实战案例精选合集
处理过线上问题的同学基本都遇到过系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题。这些问题最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本期小编集合了HeapDump性