本文整理了一份OOM内存泄露问题速查备忘录,详细见下文。
1、核心步骤- top、free、df三连,查看CPU、内存、磁盘的大致情况。
- netstat -lp 查看端口占用情况。
- 导出内存dump文件:
# 保存了堆内存现场
jmap -dump:format=b,file=heap.dump pid
# 强制保存了堆内存现场
jmap -F -dump:format=b,file=heap.dump pid
- 保存线程栈:
# 保存了线程栈的现场
jstack pid > jstack.log
2、辅助工具
- jstat -gc[gcutil] pid [interval]查看JVM垃圾回收情况。通过 jstat 查看 GC 信息,首先就是判断 GC 时间是否较长,GC 发生是否频繁,然后看是否经常性进行 FullGC。
# 如:jstat -gc pid 1000,持续跟踪如1S一次。查看java堆的状况,显示具体数值。
jstat -gc pid 1000
# 通过 jstat -gcutil 5 1000命令查看GC信息,其中5代表进程号,1000代表显示时间。查看堆中各个区域已使用空间占其总空间的百分比。
jstat -gcutil pid 1000
- 借助MAT(Eclipse Memory Analyzer)工具分析dump文件,分析内存情况。
- 直接用文本工具打开jstack文件,分析线程占用情况。
- 借助VisualVM更直观:
直接通过文本工具打开jstack.log,搜索业务相关包名,应该大致能定位出问题: