本文整理了一份OOM内存泄露问题速查备忘录,详细见下文。
# 保存了堆内存现场
jmap -dump:format=b,file=heap.dump pid
# 强制保存了堆内存现场
jmap -F -dump:format=b,file=heap.dump pid
# 保存了线程栈的现场
jstack pid > jstack.log
# 如:jstat -gc pid 1000,持续跟踪如1S一次。查看java堆的状况,显示具体数值。
jstat -gc pid 1000
# 通过 jstat -gcutil 5 1000命令查看GC信息,其中5代表进程号,1000代表显示时间。查看堆中各个区域已使用空间占其总空间的百分比。
jstat -gcutil pid 1000
直接通过文本工具打开jstack.log,搜索业务相关包名,应该大致能定位出问题:
1. 用MAT工具打开dump文件
2. 一般打开Histogram视图,这样能快速地发现问题,也可以打开Leak Suspects(泄露嫌疑),如下图:
寻找这个对象被哪些地方引用了,如下图:
查看大对象,找出自己业务相关的关键引用:
根据上面GC Roots的结果,在结合自身的业务代码排查下,一般都会找到线索,比如:
本文整理了一份OOM内存泄露问题速查备忘录。核心内容是: