使用MemoryAnalyzer来排查Java OutOfMemory问题
工具
arthas
JDK17
准备
新版MemoryAnalyzer需要JDK17环境,手动下载JDK17并解压,然后在MemoryAnalyzer.exe执行程序目录下,找到MemoryAnalyzer.ini
并编辑,在前面加上(第二行换成jdk17的地址):
-vm
C:\Users\Administrator\.jdks\corretto-17.0.7\bin\javaw.exe
完事保存即可
步骤
使用获取jvm heap dump文件,注意:主动获取操作会使服务暂时卡住,非必要时慎用
使用
arthas
获取java -jar arthas-boot.jar # 选择进程后输入下面语句,后面为dump输出路径 heapdump /tmp/dump.hprof
使用
java自带的jmap获取
# 最后跟的是jvm进程号 jmap -dump:file=/tmp/dump.hprof 需要DUMP的jvm进程号 # format=b指定为二进制格式文件 jmap -dump:format=b,file=/tmp/dump.hprof 需要DUMP的jvm进程号
注意heap文件大小会等于jvm的heap大小,需要保证磁盘空间足够
- 打开MemoryAnalyzer,注意MemoryAnalyzer的内存配置需要大于这个dump文件的大小,否则可能会卡死,内存配置在ini文件中改,最后一行
-Xmx4096m
- 点击
File-Open Heap Dump
,打开dump文件,之后程序会加载并分析heap文件,耐心等待即可 - List Object查看所有对象
- 点击一下Retained Heap即可按照对象占用内存大小进行排序
最后发现是spire.pdf中内存没有释放,回去查找对应代码修改即可
分别是哔哩哔哩序号35,小米运动序号2,米友社序号13,这个是同一个账号下运行的任务