因Java堆是Java对象在内存中使用的主要内存空间,当发生内存溢出或泄漏时,保存堆信息是问题产生原因的重要原料及问题分析的基础,而后才能分析追根溯源。

这里记录演示产生内存溢出生成堆转储文件,使用工具打开该文件进行初步分析的过程,作为备忘。

生成hprof文件

假设有以下程序

public class OOMHeapTest {/**-XX:+HeapDumpOnOutOfMemoryError -Xmx10m -Xms10m -XX:+PrintGCDetails -XX:SurvivorRatio=8*/public static void main(String[] args){oom();}private static void oom(){Map<String, Pilot> map = new HashMap<String, Pilot>();Object[] array = new Object[1000000];for(int i=0; i<1000000; i++){String d = new Date().toString();Pilot p = new Pilot(d, i);map.put(i+"dyh", p);array[i]=p;}}
}

在运行vm参数中设置

-XX:+HeapDumpOnOutOfMemoryError -Xmx10m -Xms10m

设置堆大小为10MB,内存溢出时生成堆转储文件。堆转储文件如不设置存储目录,会保存于工程的根目录中 。文件后缀为hprof。

如上程序,跑完后在控制台有以下信息

java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid15176.hprof ...
Heap dump file created [15615114 bytes in 0.059 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceededat com.dyh.jdk_jvm.heap.OOMHeapTest.oom(OOMHeapTest.java:24)at com.dyh.jdk_jvm.heap.OOMHeapTest.main(OOMHeapTest.java:16)

到Java工程所在目录查看,有文件java_pid15176.hprof生成。

-XX:HeapDumpPath=F:/heapfile/heap_dump-%t.hprof,可指定文件路径

打开hprof文件进行工具分析的几种方式

打开hprof文件的工具有不少,jdk本身就有,另外还有不少厂商开发了专门的分析工具,这些工具有的可能比jdk的更好用。以下演示几种打开hprof文件的方法。

第一种,jdk/bin下的jhat

在jhat.exe的所在目录打开cmd(或者在其他目录打开cmd,然后引用该exe文件的路径亦可)

如jhat D:\yourpath\projectForTest\Eclipse_V4.6.1_projects\Eclipse_V4.6.1_projects_jdk_jvm\java_pid8128.hprof,这样就可为该堆转储文件生成报告,执行后的控制台信息

这说明堆转储文件的分析报告已经生成,可以在浏览器通过localhost:7000来访问,如

至于这个报告如何看,这里不再深入讨论。

第二种,IBM heapanalyzer

可通过IBM官网下载工具及阅读使用说明

https://www.ibm.com/support/pages/node/1109955?mhsrc=ibmsearch_a&mhq=heapanalyzer

如java -Xmx256m -jar ha456.jar可打开工具

加载完后视图

工具的分析报告不再深入讲解。

第三种,Eclipse Memory Analysis

eclipse也集成插件可以使用,可以集成到eclipse使用,也可以单独使用。可搜索“Eclipse Memory Analysis”获取。

单独运行MemoryAnalyzer.exe

分析报告页面

第四种, jdk的visualvm

Java堆转储文件的生成及工具分析相关推荐

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

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

  2. 创建和分析 Java 堆转储(Heap Dumps)

    作为 Java 开发人员,我们熟悉我们的应用程序抛出 OutOfMemoryErrors 或我们的服务器监控工具抛出警报并抱怨 JVM 内存利用率高. 要调查内存问题,通常首先要查看 JVM 堆内存. ...

  3. java 堆转储快照_捕获Java堆转储的7个选项

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

  4. 捕获Java堆转储的7个选项

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

  5. java 堆转储快照_Java堆转储:您可以完成任务吗?

    java 堆转储快照 如果您像我一样对Java性能充满热情,那么堆转储分析对您来说应该不是一个谜. 如果是这样,那么好消息是您将有机会增加您的Java故障排除技能和JVM知识. JVM现在已经发展到这 ...

  6. Java堆转储:您可以完成任务吗?

    如果您像我一样对Java性能充满热情,那么堆转储分析对您来说应该不是一个谜. 如果是这样,那么好消息是您将有机会提高您的Java故障诊断技能和JVM知识. JVM现已发展到今天,与旧的JDK 1.0 ...

  7. linux 导出堆转储文件

    linux 导出堆转储文件 1.切换用户,创建目录 2.查询java进程pid 3.导出堆转储文件 4.查看堆转储文件 4.1 jhat 4.2 jvisual 1.切换用户,创建目录 su - ad ...

  8. Java堆转储Dump文件的几种方法,java高级程序员面试笔试

    jmap -dump:live,format=b,file=/tmp/dump.hprof 12587 我们可以通过使用jps命令轻松获得Java进程的pid. 请记住,jmap是作为实验工具引入JD ...

  9. java内存 phd文件抓取_您可以从IBM PHD Java堆转储中提取字符串的值吗?

    我有一个来自IBM jvm的PHD格式堆转储,我希望检查一些字符串的值.使用Sun JVM的二进制hprof转储,这是可能的,但是我无法从IBM转储中恢复此信息. 我试过了: >具有IBM DT ...

最新文章

  1. qrcode生产带logo_“白板”口罩打上LOGO装名牌 警方重拳出击清市场
  2. OpenCV源代码编译
  3. 不仅仅是浏览器 走近Chrome开发人员工具
  4. bit不是java基本类型吗_Java bit / byte 基本数据类型
  5. maven打包时跳过测试
  6. Android Screen
  7. 冲刺One之站立会议6 /2015-5-19
  8. java中访问权限的设置
  9. ENVI 5.6/IDL 8.8 新特性介绍
  10. Double binary trees
  11. SAP ERP常用事务代码和表
  12. cdr多页面排版_CDR排版技巧
  13. CSDN页面上方广告条太烦人?js写个油猴脚本给它隐藏了~
  14. Regression 中的 R方
  15. linux ps-x,Linux总结----PS命令
  16. ASP.NET Core 集成AAD认证在Docker中运行时要注意的一个问题
  17. 包装类-自动装箱和自动拆箱
  18. 任意用户密码重置的10种常见姿势
  19. 【IPv6+燎原系列—第2期】IPv6+逐梦赛场,勇夺属于通信人的“金牌”
  20. mysql 官网下载太慢了,来这里!!!

热门文章

  1. LaTeX——基本介绍及字体设置
  2. POC [Proof of Concept] 原型 / 概念证明
  3. 解决Word插入的英文间距过大的问题
  4. Android 修改app的语言(主要讲繁体与简体的转换)
  5. 网络分流器-网络分流器TAP网络流量监控
  6. linux性能调优命令精华
  7. 编程获取Revit视图中的所有实例对象数量
  8. TFN 雷达信号模拟器可定制型
  9. C语言查课系统的报告,河南工业大学C语言库管理系统课程报告
  10. Andriod Zxing 二维码扫描 实现连续扫描