Java堆转储文件的生成及工具分析
因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堆转储文件的生成及工具分析相关推荐
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...
- 创建和分析 Java 堆转储(Heap Dumps)
作为 Java 开发人员,我们熟悉我们的应用程序抛出 OutOfMemoryErrors 或我们的服务器监控工具抛出警报并抱怨 JVM 内存利用率高. 要调查内存问题,通常首先要查看 JVM 堆内存. ...
- java 堆转储快照_捕获Java堆转储的7个选项
java 堆转储快照 堆转储是诊断与内存相关的问题的重要工件,例如内存泄漏缓慢,垃圾回收问题和java.lang.OutOfMemoryError.它们也是优化内存消耗的重要工件. 有很棒的工具,例如 ...
- 捕获Java堆转储的7个选项
堆转储是诊断与内存相关的问题的重要工件,例如内存泄漏缓慢,垃圾回收问题和java.lang.OutOfMemoryError.它们也是优化内存消耗的重要工件. 有很多很棒的工具,例如Eclipse M ...
- java 堆转储快照_Java堆转储:您可以完成任务吗?
java 堆转储快照 如果您像我一样对Java性能充满热情,那么堆转储分析对您来说应该不是一个谜. 如果是这样,那么好消息是您将有机会增加您的Java故障排除技能和JVM知识. JVM现在已经发展到这 ...
- Java堆转储:您可以完成任务吗?
如果您像我一样对Java性能充满热情,那么堆转储分析对您来说应该不是一个谜. 如果是这样,那么好消息是您将有机会提高您的Java故障诊断技能和JVM知识. JVM现已发展到今天,与旧的JDK 1.0 ...
- linux 导出堆转储文件
linux 导出堆转储文件 1.切换用户,创建目录 2.查询java进程pid 3.导出堆转储文件 4.查看堆转储文件 4.1 jhat 4.2 jvisual 1.切换用户,创建目录 su - ad ...
- Java堆转储Dump文件的几种方法,java高级程序员面试笔试
jmap -dump:live,format=b,file=/tmp/dump.hprof 12587 我们可以通过使用jps命令轻松获得Java进程的pid. 请记住,jmap是作为实验工具引入JD ...
- java内存 phd文件抓取_您可以从IBM PHD Java堆转储中提取字符串的值吗?
我有一个来自IBM jvm的PHD格式堆转储,我希望检查一些字符串的值.使用Sun JVM的二进制hprof转储,这是可能的,但是我无法从IBM转储中恢复此信息. 我试过了: >具有IBM DT ...
最新文章
- qrcode生产带logo_“白板”口罩打上LOGO装名牌 警方重拳出击清市场
- OpenCV源代码编译
- 不仅仅是浏览器 走近Chrome开发人员工具
- bit不是java基本类型吗_Java bit / byte 基本数据类型
- maven打包时跳过测试
- Android Screen
- 冲刺One之站立会议6 /2015-5-19
- java中访问权限的设置
- ENVI 5.6/IDL 8.8 新特性介绍
- Double binary trees
- SAP ERP常用事务代码和表
- cdr多页面排版_CDR排版技巧
- CSDN页面上方广告条太烦人?js写个油猴脚本给它隐藏了~
- Regression 中的 R方
- linux ps-x,Linux总结----PS命令
- ASP.NET Core 集成AAD认证在Docker中运行时要注意的一个问题
- 包装类-自动装箱和自动拆箱
- 任意用户密码重置的10种常见姿势
- 【IPv6+燎原系列—第2期】IPv6+逐梦赛场,勇夺属于通信人的“金牌”
- mysql 官网下载太慢了,来这里!!!