线上OOM问题排查
背景:线上服务器内存资源水位经常达到85%,有时候甚至OOM,这个时候怎么去分析优化呢?
一、获取dump文件
目标 Java 进程的 PID 是 13700。你可以按照以下两种常用方法来正确获取 dump 文件:
方法一:使用 jmap 命令手动导出(推荐)
可以直接复制以下命令在终端执行。这里加上了 live 参数,它的作用是只保存堆中存活的对象,这样生成的 dump 文件体积会更小,也更方便后续分析:
jmap -dump:live,format=b,file=/home/project/logs/dumpfile.hprof 13700
参数说明:
live:只导出当前存活的对象(生产环境强烈建议加上)。format=b:指定输出格式为二进制格式(binary)。file=...:指定 dump 文件的保存路径和文件名。
方法二:配置 JVM 参数自动导出
如果你希望在程序发生内存溢出(OOM)时系统能自动保存现场,可以在启动应用时添加以下 JVM 参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/project/logs/oom_dump.hprof
这样当应用触发 OutOfMemoryError 时,JVM 会自动在指定路径生成 dump 文件。
⚠️ 生产环境注意事项:
生成 dump 文件(尤其是使用 jmap 时)会触发 Full GC 并导致应用暂停(STW, Stop-The-World)。由于你的进程内存占用较大(约 5GB),生成 dump 文件可能会耗费一定时间。建议在业务低峰期进行操作,并确保目标磁盘有足够的可用空间。
dump 文件生成后,如何使用 jvisualvm 或 MAT 来分析内存泄漏?
二、分析dump文件
1、需要使用工具查看,这里使用MAT。
- MAT 官方下载链接:https://www.eclipse.org/mat/

- 配置JDK环境才能使用MAT ,JDK 21 官方下载链接 https://www.oracle.com/java/technologies/downloads/#java21

2、使用教程



浙公网安备 33010602011771号