jvm内存溢出排查
1.导出内存快照
1.系统自动生成内存溢出快照
jar启动命令追加参数:
-XX:+HeapDumpOnOutOfMemoryError
项目下一次堆内存溢出异常,生成文件
java_pidxxxxx.hprof
2.手动导出内存快照
查看服务pid
jps
手动导出内存快照
jmap [options] pid
例子:
# 生成堆转储快照
jmap -dump:live,format=b,file=jmap.bin 12771
#:live: 只打印存活的对象
#format=b:以二进制的格式进行存储
#file=jmap.bin:将文件保存到当前目录,文件名称为jmap.
参数说明:
options参数命令详解
-
no option:不带参数查询进程,就像这样jmap 12271,查看内存中共享对象信息;,类似Solaris pmap命令;
-
heap: 显示java堆详细信息
-
histo[:live] :显示堆中对象的统计信息,加:live值打印存活的对象,如果不加:live则查询所有的对象;
-
clstats:打印类加载信息
-
finalizerinfo:显示在F-Queue队列等待被清理的对象;在发生GC之前某些对象可能要被回收,那么在回收之前,这些对象就会放到F-Queue队列中;清理时会执行对象的finalizer()方法;
-
dump :生成堆转储快照
-h 和 -help 显示jinfo命令的帮助信息。
pid:要打印配置信息的Java虚拟机的进程ID。
2.用ide自带工具profiler分析快照
菜单路径:Profiler->Open Snapshot :选择java_pidxxxxx.hprof文件
视图类型:
热点图(Flame Graph)
这个视图可以帮助您可视化选定线程的调用堆栈,并查看它随时间的变化。栈框架越宽,方法执行时间越长。彩色块显示本地代码、库代码和用户代码。
调用树(Call Tree)
此视图显示方法使用的 CPU 时间百分比、应用程序中的方法执行路径以及总采样计数。调用树对于快速概述应用程序活动并检测关键执行路径非常有用。
方法列表(Method List)
此视图显示在分析数据时执行的方法列表。它们都按累积采样时间排序。每个所选的方法都有几个视图,可以向您显示该方法的调用者或被调用者。
时间轴或(Timeline)
时间轴是线程活动随时间的视觉表示。它有助于检测异常的 GC 活动、多线程问题(例如死锁)等。
事件(Events)
此视图显示与 JVM 事件相关的数据,例如类加载、垃圾回收、操作系统事件等等。