java 堆转储快照_捕获Java堆转储的7种方法

本文详细介绍了捕获Java堆转储的7种方法,包括使用jmap、HeapDumpOnOutOfMemoryError、jcmd、JVisualVM、JMX、程序化方法以及IBM管理控制台。堆转储对于诊断内存问题和优化内存消耗至关重要。重点推荐使用jmap、HeapDumpOnOutOfMemoryError和jcmd,而其他方法则作为备选方案。
摘要由CSDN通过智能技术生成

java 堆转储快照

Java堆转储是诊断与内存相关的问题(例如内存泄漏缓慢,垃圾回收问题和java.lang.OutOfMemoryError)的重要工件。 它们也是优化内存消耗的重要工件。

有很棒的工具,例如Eclipse MATHeap Hero,可以分析堆转储。 但是,您需要为这些工具提供以正确的格式和正确的时间点捕获的堆转储。

本文为您提供了捕获堆转储的多个选项。 但是,我认为前三个是有效的选择,而其他三个则是个不错的选择。

1. jmap

jmap打印堆转储到指定的文件位置。 该工具打包在JDK中。 可以在<JAVA_HOME> \ bin文件夹中找到它。

这是调用jmap的方法:

jmap -dump:live,file=<file-path> <pid> 
where
pid: is the Java Process Id, whose heap dump should be captured
file-path: is the file path where heap dump will be written in to.

例:

jmap -dump:live,file=/opt/tmp/heapdump.bin 37320

注意:传递“实时”选项非常重要。 如果通过此选项,则仅将内存中的活动对象写入堆转储文件。 如果未通过此选项,则所有对象,即使是准备好进行垃圾回收的对象也会打印在堆转储文件中。 它将大大增加堆转储文件的大小。 这也将使分析变得乏味。 为了解决内存问题或优化内存,仅“ live”选项就足够了。

2. HeapDumpOnOutOfMemoryError

当应用程序遇到java.lang.OutOfMemoryError时,最好立即捕获堆转储。 这可以帮助您诊断问题,因为您想知道在发生java.lang.OutOfMemoryError时哪些对象位于内存中以及它们占用的内存百分比。

但是,由于当前的高温,大多数情况下,IT /运营团队会忘记捕获堆转储。 不仅如此,他们还重新启动了应用程序。 如果不及时捕获堆转储,就很难诊断出任何内存问题。

这就是该选项非常方便的地方。 在应用程序启动期间传递-XX:+HeapDumpOnOutOfMemoryError系统属性时,JVM将在JVM遇到OutOfMemoryError时立即捕获堆转储。

用法示例:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tmp/heapdump.bin

注意:捕获的堆转储将在'-XX:HeapDumpPath'系统属性指定的位置打印。

最佳实践:始终保持在所有应用程序中配置此属性,因为您永远不知道何时会发生OutOfMemoryError.jcmd3。

3. jcmd

jcmd工具用于将诊断命令请求发送到JVM。 它打包为JDK的一部分。 可以在\ bin文件夹中找到它。

这是调用jcmd的方法:

jcmd <pid> GC.heap_dump <file-path> 
where
pid: is the Java Process Id, whose heap dump should be captured
file-path: is the file path where heap dump will be written in to.

例:

jcmd 37320 GC.heap_dump /opt/tmp/heapdump.bin

4. JVisualVM

JVisualVM是一个监视,故障排除工具,打包在JDK中。 启动此工具时,您可以看到本地计算机上正在运行的所有Java进程。 您也可以使用此工具连接到在远程计算机上运行的Java进程。

脚步:

  1. 在\ bin \文件夹下启动jvisualvm
  2. 右键单击其中一个Java进程
  3. 单击下拉菜单上的“堆转储”选项
  4. 将生成堆转储
  5. 将在“摘要”选项卡>“基本信息”>“文件”部分中指定生成堆转储的文件路径。
Java堆跳转

图:从JVisualVM捕获堆转储

5. JMX

有一个com.sun.management:type=HotSpotDiagnostic MBean 。 此MBean具有“ dumpHeap”操作。 调用此操作将捕获堆转储。 'dumpHeap'操作采用两个输入参数:

  1. outputFile:应将堆转储写入的文件路径
  2. live:传递“ true”时,仅捕获堆中的活动对象

您可以使用JMX客户端(例如JConsole,jmxsh或Java Mission Control)来调用此MBean操作。

Java堆转储

图:使用Java Mission Control作为JMX客户端来生成堆转储

6.程序化方法

除了使用工具之外,您还可以以编程方式从应用程序中捕获堆转储。 在某些情况下,您可能希望基于应用程序中的某些事件来捕获堆转储。 这是Oracle的一篇好文章,通过调用com.sun.management:type=HotSpotDiagnostic MBean JMX Bean,提供了用于从应用程序捕获堆转储的源代码,我们在上述方法中对此进行了讨论。

7. IBM管理控制台

如果您的应用程序在IBM Websphere Application Server上运行,则可以使用管理控制台来生成堆。
脚步:

  1. 启动管理控制台
  2. 在导航窗格中,单击故障排除> Java转储和核心
  3. 选择要为其生成堆转储的server_name
  4. 点击堆转储产生堆转储您指定的服务器

您也可以使用wsadmin生成堆转储。

翻译自: https://jaxenter.com/7-ways-capture-java-heap-dumps-143693.html

java 堆转储快照

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值