linux上如何排查JVM内存过高?

2024-07-29 19:18:07 浏览数 (1)

怎么排查JVM内存过高?

前言:

想必工作一两年以后的同学都会逐渐面临到,jvm等问题,但是可能苦于无法熟练的使用一些工具;本文将介绍几个比较常用分析工具的使用方法,带着大家一步步定位分析问题。

1、top 查看进程

我们来看pid 16160 这个进程占用资源相对来说较高

2、top -Hp pid 查看指定进程下线程

其实到这一步,我们已经进一步缩小了排查范围了,从如上图所示,我们可以知道,线程22652是一个java的定时任务线程,以及我们资源占用较多的java子线程。

代码语言:javascript复制
到达这一步我们现在有很多工具可以去详细定位了,介绍几个我平常用的比较多的吧

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

参考如下命令:

代码语言:javascript复制
nohup  java -Xms1024m -Xmx1024m -XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx.hprof -jar xxx.jar > info.log &

7,最后奉上大招

一个我也很喜欢用的工具,有些时候可能有些电脑没有环境,无法用自带的分析工具,这个在线的工具就派上用场了。

HeapHero :https://heaphero.io/index.jsp

0 人点赞