线上服务的FGC问题排查

线上服务的FGC问题排查

    • 检查JVM配置
    • 观察老年代的内存变化
    • 通过jmap命令查看堆内存中的对象
    • 进一步dump堆内存文件进行分析

检查JVM配置

通过以下命令查看JVM的启动参数:
ps aux | grep "applicationName=adsearch"
线上服务的FGC问题排查_第1张图片
可以看到堆内存为4G,新生代为2G,老年代也为2G,新生代采用ParNew收集器,老年代采用并发标记清除的CMS收集器,当老年代的内存占用率达到80%时会进行FGC。配置参数并没有什么问题。

观察老年代的内存变化

通过观察老年代的使用情况,可以看到:每次FGC后,内存都能回到500M左右,因此我们排除了内存泄漏的情况。
线上服务的FGC问题排查_第2张图片

通过jmap命令查看堆内存中的对象

线上服务的FGC问题排查_第3张图片
上图中,按照对象所占内存大小排序,显示了存活对象的实例数、所占内存、类名。可以看到排名第一的是:int[],而且所占内存大小远远超过其他存活对象。至此,我们将怀疑目标锁定在了 int[]

进一步dump堆内存文件进行分析

通过JVisualVM工具导入dump出来的堆内存文件,同样可以看到各个对象所占空间,其中int[]占到了50%以上的内存,进一步往下便可以找到 int[] 所属的业务对象,发现它来自于架构团队提供的codis基础组件。
线上服务的FGC问题排查_第4张图片

你可能感兴趣的:(java)