- 排查是否是内存泄漏
- 定位占用CPU最高的java进程ID
执行top命令
- 查看内存使用概况
jmap -heap java进程ID
如上图,jvm划分为几个区,重点看每一个区总空间及总使用率情况。如果全部空间总使用率加起来超过MaxHeapSize的80%,说明内存大概率存在泄漏。
注意: PS Old Generatrion分区占用率超过90%,也大概率存在内存泄漏。
- 查看占用CPU最高的java线程
top -Hp java进程ID
运行几次并截图保留下来。如上图排在最顶部的第一个线程号记录下来,然后通过以下命令将java线程号转换成16进制(后续在jstack定位线程用到)
printf '%x\n' java线程号
- 抓取java线程日志,定位线程最高的java线程及其正在执行的代码
jstack -l JAVA进程ID > s1.log
注意:国产环境下Tongweb不支持jmap命令,可以通过tongweb管理界面的线程日志快照转储出来。
- 从线程日志中定位线程
linux下 用vi打开日志文 vi s1.log
然后按下键盘/ ,进入搜索内容模式,输入在(3)步骤中找到的CPU最高的16进制线程ID。
定位到线程,如果线程正在执行我们编写的代码,大概率此代码存在死循环。
如果线程类似如下:
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f9af801e800 nid=0x1d00a runnable
说明此是因为内存泄漏,导致GC内存回收线程在大量内存对象中查找可回收内存从而从而耗尽CPU。