1、Heap Dump是什么?
Heap Dump 也被称为 堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。
堆转储文件是诊断内存相关问题的重要信息来源,例如内存泄漏,垃圾收集问题 和 java.lang.OutOfMemoryError,同时它也是优化内存消耗的重要依据。
本文为您提供了捕获堆转储的多种方式,如下:
2、jmap
jmap 可以将堆转储文件保存到指定的位置,使用方法如下:
jmap -dump:format=b,file=<file-path> <pid>
pid: 进程ID
file-path: 文件存放路径
使用示例:
jmap -dump:format=b,file=/opt/tmp/my_heap_dump.txt 87960
另外可以配合子选项使用,比如:-dump:[live,]format=b,file= , 如果传递此选项(live),则只将内存中的活动对象写入堆转储文件。 如果未传递此选项,则所有对象(即使是准备好进行垃圾回收的对象)都将打印在堆转储文件中。它会增加堆转储文件的大小,同时影响分析的结果,因此解决内存问题或优化内存,只需统计活着的对象就足够了。
3、HeapDumpOnOutOfMemoryError
当应用程序遇到 java.lang.OutOfMemoryError 时,理想的做法就是在此时捕获堆转储来诊断问题。但是,由于实际情况紧急,为了快速恢复使用,大多数情况下,IT /运营团队都会忘记捕获堆转储, 不仅如此,他们还重启了应用程序。如果不在正确的时间捕获堆转储,就很难诊断出任何内存问题。
在JVM的配置参数中可以添加 -XX:+HeapDumpOnOutOfMemoryError 参数,当应用抛出 OutOfMemoryError 时自动生成dump文件。
使用示例:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tmp/heapdump.txt
4、jcmd
可以用它来导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析
jcmd <pid> GC.heap_dump <file-path>
pid: 接收诊断命令请求的进程ID
file-path: 堆转储文件存放路径
使用示例:
jcmd 37320 GC.heap_dump /opt/tmp/heapdump.txt
5、JVisualVM
JVisualVM是一个打包在JDK中的监视,故障排除工具。 启动此工具时,您可以看到本地计算机上运行的所有Java进程。 您还可以使用此工具连接到远程计算机上运行的java进程。
1、在命令行输入 jvisualvm ,如果已经配好环境变量便能启动该工具
2、选择一个应用程序,右键选择菜单中的 Heap Dump,稍等片刻便会生成堆转储文件
6、JMX
JMX 其实是一个 com.sun.management:type=HotSpotDiagnostic MBean,它具有操作堆转储的方法,可以使用JMX 的客户端工具进行操作,例如:JConsole、jmxsh、Java Mission 、VisualVM等
7、Programmatic Approach(编程方式)
您也可以通过编程方式从应用程序中捕获堆转储,而不是使用工具。 在某些情况下,您可能希望根据应用程序中的某些事件捕获堆转储, 通过调用我们在上面的方法中讨论过的com.sun.management:type=HotSpotDiagnostic MBean JMX Bean,提供了从应用程序捕获堆转储的源代码。
推荐两款好用的在线分析堆栈信息的工具:
线程信息分析:
http://fastthread.io/my-thread-report.jsp?p=c2hhcmVkLzIwMTkvMDEvOS8tLXN0YWNrLnppcC0tNi01Mi02