JVM :关于捕获 Java Heap Dump 的6种方式

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://heaphero.io/my-heap-report.jsp?p=YXJjaGl2ZWQvMjAxOS8wMS85Ly0taGVhcF8xMjMuemlwLTYtNTctMS5qc29uLS0=

线程信息分析:
http://fastthread.io/my-thread-report.jsp?p=c2hhcmVkLzIwMTkvMDEvOS8tLXN0YWNrLnppcC0tNi01Mi02

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值