记录最近两次java内存过高的分析

2023-04-12


背景


最近出现java程序突然挂了的情况,查看日志发现是内存突然暴增导致,于是使用jmap和jstack分析。


jmap分析java内存使用


-histo 查看对象列表

jmap -histo 1234 查找进程号为1234的java程序的jvm堆中对象详细占用情况,我们一般加上head -20查看前20的占用。


jmap -histo 1234|head -20



-heap 查看堆详情

jmap -heap 1234 查看进程号为1234的Java程序的整个jvm内存状态


java程序CPU占用过高问题排查


ps -mp pid -o THREAD,tid,time


printf “%x\n” number


生成 heap dump 文件


经过以上操作没有分析出来,那就只能dump heap 文件进行分析了


jmap -dump:live,format=b,file=heap.hprof 2075605


MAT内存分析


内存分析指MAT,即memory analysis tool,通常使用eclipse提供的MemoryAnalyzer的工具包解析dump文件。



具体分析步骤


# 找到出现问题的程序
ps -ef|grep java

# 查看特定程序的线程情况
top -p 2075605 -H
 
# 线程详情, nid 特定线程的16进制ID
jstack 2075605 | grep -A 100 nid=0x1fabd9

# 堆详情
jmap -heap 2075605

# 对象列表
jmap -histo 2075605
# 经过以上操作没有分析出来,那就只能dump heap 文件进行分析了
# 生成 heap dump 文件
jmap -dump:live,format=b,file=heap.hprof 2075605



本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com