怎么排查JVM内存过高?
前言:
想必工作一两年以后的同学都会逐渐面临到,jvm等问题,但是可能苦于无法熟练的使用一些工具;本文将介绍几个比较常用分析工具的使用方法,带着大家一步步定位分析问题。
1、top 查看进程
我们来看pid 16160 这个进程占用资源相对来说较高
2、top -Hp pid 查看指定进程下线程
其实到这一步,我们已经进一步缩小了排查范围了,从如上图所示,我们可以知道,线程22652是一个java的定时任务线程,以及我们资源占用较多的java子线程。
到达这一步我们现在有很多工具可以去详细定位了,介绍几个我平常用的比较多的吧
3,jstack
把16进制转一下10进制
因为Java线程文件中的线程ID是16进制,所以需要将线程PID 从十进制转换成十六进制
命令:
echo "obase=16;161633" | bc
然后转换后输出: 3F23
最后执行 jstack 3F23
如下图已经详细打印了堆栈,自己可以去分析了。
4,Arthas
这是一个我之前写的jvm分析工具,阿里巴巴的,可以挪步,我个人觉得这个工具更爽
Arthas:https://blog.csdn.net/qq_38420688/article/details/109166153
5,jconsole
6,最后兜底
可以在服务启动的时候加入参数控制系统oom时输出堆栈,便于我们定位问题: -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/**.hprof
参考如下命令:
nohup java -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx.hprof -jar xxx.jar > info.log &
7,最后奉上大招
一个我也很喜欢用的工具,有些时候可能有些电脑没有环境,无法用自带的分析工具,这个在线的工具就派上用场了。
HeapHero :https://heaphero.io/index.jsp