Java内存溢出定位具体问题
最近经常接收到公司监控平台报警 集群的jvm old过高 就一个集群的实际分析情况进行分析一下具体的实战思路
1、首先我们登录集群服务器通过top命令能够看到具体的进制占用情况发现进程id 16964 cpu占比很高,我么可以通过 ps -ef|grep 16964 发现服务的进程是recommendservice 和接收到报警的集群是一致的
nid : 对应的Linux操作系统下的tid线程号,也就是前面转化的16进制数字
tid: 这个应该是jvm的jmm内存规范中的唯一地址定位
2.接下来我们排查具体问题出现什么地方 ?
在CPU过高的情况下,查找响应的线程,一般定位都是用nid来定位的。而如果发生死锁之类的问题,一般用tid来定位。 根据刚才查到的进程id继续定位 具体那个线程号 top -H -p 16964
由此可以看出占用CPU较高的线程,但是这些还不高,无法直接定位到具体的类。nid是16进制的,所以我们要获取线程的16进制ID:
printf “%x\n” 16996 输出结果:4264
同时我们可以查看一下GC情况jstat -gcutil 16964 5000
通过发现FGC FULL GC次数不断增加 这是我们需要定位具体的代码问题了 我们次数dump具体的进程id
dump 内存 来分析具体的原因 jmap -dump:live,format=b,file=dump.hprof 16964
dump下来的日志巨大 差不多5个多G
通过Memory Analyzer分析 http://www.eclipse.org/mat/(内存分析工具)
发现到具体的问题是一个框架jar包版本过低有内存泄漏问题 造成的、收集上报数据没有及时的释放内存导致、然后升级对应框架包 重新上线解决问题
[url=https://oscialipop.com]Cialis[/url] Unkrmm Cialis Propecia Young Men https://oscialipop.com – cialis for daily use Jibtpi Levaquin 750mg Internet