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

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

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

jmap

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

这是调用jmap的方法:

jmap -dump:format=b,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:format=b,file=/opt/tmp/heapdump.bin 37320

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

HeapDumpOnOutOfMemoryError

当应用程序遇到java.lang.OutOfMemoryError时,理想的方法是立即捕获堆转储以诊断问题,因为您想知道java.lang.OutOfMemoryError发生时内存中有哪些对象以及它们占据的内存百分比。但是,由于很多方面的原因,大多数情况下,IT/运营团队都无法及时捕获堆转储。不仅如此,他们还重新启动了应用程序。如果没有在正确的时间捕获堆转储,就很难诊断出任何内存问题。

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

用法:

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

  • 注意:捕获的堆转储将在'-XX:HeapDumpPath'系统属性指定的位置打印。
  • 最佳实践:始终保持在所有应用程序中配置此属性,因为您永远不知道何时会发生OutOfMemoryError。

jcmd

jcmd工具用于将诊断命令请求发送到JVM。它打包为JDK的一部分。可以在JAVA_HOMTE\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

JVisualVM

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

步骤:

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

JMX

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

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

您可以使用JConsole,jmxsh,Java Mission Control 等JMX客户端来调用此MBean操作。我这里使用了jconsole:

编程代码

除了使用工具之外,您还可以以编程方式从应用程序中捕获堆转储。在某些情况下,您可能希望基于应用程序中的某些事件来捕获堆转储。可以通过调用com.sun.management:type=HotSpotDiagnostic MBean JMX Bean,提供了从应用程序捕获堆转储的源代码。

技术类文章精选

非技术文章精选

如何获取JVM堆转储文件的更多相关文章

  1. Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用

    原文地址:http://www.javatang.com JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了J ...

  2. 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可 ...

  3. mat 使用 分析 oom 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...

  4. [Android Memory] 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    转载地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html Eclipse Memory Analyzer ...

  5. 获取JVM的dump文件

    获取JVM的dump文件的两种方式 1. JVM启动时增加两个参数: #出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址: -XX ...

  6. @Java VisualVM分析堆转储文件

    测试程序 public class HeapOOM { private static int i = 0; static class OOMObject { } public static void ...

  7. Eclipse Memory Analysis进行堆转储文件分析

    生成堆转储文件 新建项目,设置Eclispe Java堆的大小: (1)限制Java堆大小:将最小值 -Xms参数与最大值-Xmx参数设置一样可避免堆的扩展         -Xmx20m -Xms2 ...

  8. 获取JVM转储文件的Java工具类

    在上期文章如何获取JVM堆转储文件中,介绍了几种方法获取JVM的转储文件,其中编程方法是里面唯一一个从JVM内部获取的方法.这里就不演示了其他方法获取正在运行的应用程序的堆转储,重点放在了使用编程来获 ...

  9. 性能优化 Profiler MAT 内存泄漏 堆转储 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. poj 2631 Roads in the North (自由树的直径)

    Roads in the North Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4513   Accepted: 215 ...

  2. hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  3. 1、看源码MVC如何实例化控制器?

    我们知道MVC请求进来,然后路由匹配,然后找到控制器和Action,最后会调用Action方法,但是大家想想控制器是个普通的类,Action是个普通的实例方法,要想调用Action必须先实例化控制器, ...

  4. java 获取当前年份 月份,当月第一天和最后一天

    获取当前年份 月份,当月第一天和最后一天,工作中会经常用到,下面是代码: package basic.day01; import java.text.SimpleDateFormat; import ...

  5. Hadoop_MapReduce_03

    1. MapReduce入门 1.1 MapReduce的思想 MapReduce的思想核心是"分而治之" , 适用于大量的复杂的任务处理场景 (大规模数据处理场景) . Map负 ...

  6. 【1】基于OpenCV的DLL动态库隐式连接

    1DLL的作用 DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能 ...

  7. U8隐藏的配置项

    数据表:accinformation 我使用了一个是否自动审核库存生成的单据,看看是否能解决调拨单自动生成的其他出入库单自动审核的功能.

  8. jQuery实现下拉框默认选中

    <form class="form-inline" method="post" action="/score_result/"> ...

  9. Lucene&Solr框架之第三篇

    1.SolrCore的配置 a)schma.xml文件 b)配置中文分析器 2.配置业务域和批量索引导入 a)配置业务域 b)批量索引导入 c)Solrj复杂查询(用Query页面复杂查询.用程序实现 ...

  10. selectors模块的设计亮点

    事件类型标志的选择 在selectors模块中的开头直接定义了事件类型的标志数字,选用的是(1 << 0)就是1代替EVENT_READ读操作:使用(1 << 1)就是2代替E ...