IBM HeapAnalyzer简介使用

来源:互联网 发布:创度软件 编辑:程序博客网 时间:2024/05/16 03:19

IBM®HeapAnalyzer

 

创建者:Jinwoo Hwang(JinwooHwang.com)

 

 

欢迎来到IBM HeapAnalyzer。IBM HeapAnalyzer允许您使用其获得专利的启发式搜索引擎查找可能的Java™堆泄漏,并分析Java堆转储。

 

介绍

Heapdump包含堆中所有对象的列表。此工具分析Java SDK 1.3.1,1.4.x,5.0,6.0和7.0的堆转储

IBM HeapAnalyzer“按原样”提供。

条件

· Java运行时环境7或更高(IBM Java运行时环境7或IBM Java系统转储分析更高)



如果使用Java虚拟机的旧版本下面将引发异常:

在线程异常“主” java.lang.NoClassDefFoundError:的java / UTIL /正则表达式/ PatternSyntaxException

· 用于大型Java堆转储的64位Java运行时环境,如果需要超过4GB的内存

定义

· 根对象一个没有(不同)对象持有引用的对象。

· 父对象的对象(例如,A),其保持至少一个参考一些 (不同的)对象(例如,B)。在这种情况下,A被认为是B的父亲。 

· 所有者对象如果一个对象有多个父对象,则选择一个父对象作为所有者对象。 总大小仅用所有者对象计算。 

· 子对象至少有一个(不同的)对象 (例如A)拥有引用的对象(例如B)。在这种情况下,B被认为是A的孩子。 

· 键入相同对象的集合

· 大小对象的大小是在内存中保存该对象所需的内存量。

· 总大小一个对象的子树大小是它的大小和 从其子节点到达的所有对象大小的总和。请注意,每个 对象在处理期间都被分配了一个唯一的父代和根。 如果 家长和孩子的总体积存在显着差异,则称为总体规模下降。 

· 泄漏大小泄漏嫌疑人的总大小。如果泄漏嫌疑人包含另一名泄漏嫌疑人,泄漏大小将被嵌套泄漏嫌疑人的总大小减去

特征

· 从表视图和树视图的父视图和子视图

· 地址搜索

· 根列表视图

· 同类型查看

· 配置恢复并保存

· IBM,Solaris®和HP-UX®Java ascii /二进制Java堆转储支持

· IBM Java系统转储支持:IBM的Java 7或更高版本需要处理的最新IBM Java系统转储文件格式

· 外观和感觉选项

· 自动检测截断的堆转储

· Java Profile v1.0.1 ascii和二进制Java堆转储支持

· Solaris hprof 1.0.1二进制Java堆转储支持

· heapdump文件命令行支持。请参阅“如何运行此工具”部分

· 支持IBM便携式堆转储.phd格式以及IBM堆转储.txt和.txt.gz

· 自动检测文件格式

· 支持控制台窗口

· 从heapdump创建一棵树

· 计算每个对象的大小

· 计算每个子树的总大小

· 查找子树中的总大小下降

· 按大小显示对象之间的差距

· 按大小显示对象

· 按总大小显示对象

· 通过孩子的数量显示对象

· 按大小显示类型

· 按计数/频率显示类型

· 显示类型的字母顺序

· 显示差距分布图

· 显示对象的详细信息

· 用正则表达式查找类型

· 在输入字段,树和文本中拖放支持

· 树形导航中的书签

·找到 可能的泄漏嫌疑人

图标



实例

数组

如何运行这个工具

您需要使用Java 2 Platform Standard Edition 6或更高版本的Java运行时环境(JRE)来运行此工具。

用法<Java路径> java -Xmx [heapsize] -jar ha <HeapAnalyzer版本> .jar <heapdump文件>

例如,/ usr / java60 / bin / java -Xmx1000m -jar ha146.jar heapdump1234.txt

如果在处理堆转储时存在java.lang.OutOfMemoryError,请尝试增加最大堆大小(-Xmx)值,以便JVM获得更多内存。如果你是从Windows PC运行的,这里是一个批处理(.bat)文件(由James Stroud编写),可以帮助你运行这个文件,帮助你在你的PC上选择特定版本的Java。这是为了您的PC上安装了多个版本的Java的情况下,典型情况下。请注意,您需要修改bat文件中的目录路径,作为bat文件中的注释说明。下载批处理文件

由于性能问题,最大堆大小不应大于此工具可用物理内存大小的大小。

1.启动HeapAnalyzer

 

[初始画面]

 

2.选择文件 - >打开并选择一个堆转储文件

 

 

选择IBM堆转储文本文件,IBM便携式堆转储,Java Profile V1.0.1 ascii / binary Heap Dump或HeapAnalyzer处理文件以处理堆转储。

3.在处理堆转储期间显示进度。

 

 

4.如果您正在处理大型堆转储,则需要很长时间。以下是处理完成时的屏幕。请不要关闭这个窗口,直到你不需要这个heapdump。

 

 

 

内存泄漏嫌疑人在树视图的“传票泄漏嫌疑人”菜单下编译。

 

 

如果没有内存泄漏嫌疑,树视图默认情况下不显示。

 

 

点击Analysis菜单并选择Tree view菜单项来显示堆树。

 

 

5.以下是heapdump的树视图。

图标,表示它已经被包含在树形视图中作为所有者对象的子对象

每个树节点的格式如下所示:

TotalSize(TotalSize / HeapSize%)[ObjectSize] NumberOfChildObject(根对象数)Name地址

 

 

 

 

6.在树形视图中,您可以看到节点的详细信息,您可以搜索父节点和子节点之间的总大小降落

或者您可以通过选择一个节点并单击鼠标右键来查找地址。

 

 

“搜索总大小下降”会发现父母的总大小之间的大小下降

和父母孩子的最大总规模。

如果从“搜索总大小下降”菜单中找不到任何大小的下拉菜单,则需要减少

选项中搜索的最小总大小下降。

 

 

 

您可以通过选择菜单“查找地址”在树形视图中查找地址

 

 

以下是地址搜索的结果:

 

 

 

7.如果要查看关于节点的详细信息,只需单击,您将在右窗格中获得有关信息。或者您可以选择以下菜单。

 

 

以下是heapdump树中详细节点信息的屏幕

 

 

 

8.您可以通过选择“添加书签”来放置书签来保存位置并继续导航树。

 

 

 

书签存储在“树状视图”菜单栏的“转到书签”菜单中。

你可以通过点击书签去树中保存的位置

 

 

 

通过点击“删除书签”菜单中的书签可以删除书签。

 

 

 

9.如果树上有很多孩子,可以在树的底部看到“NNNN more children”。

通过展开节点可以看到更多的孩子。

 

 

 

您也可以使用父节点中的“显示更多的孩子”菜单。

 

 

现在你可以看到更多的孩子。

 

 

 

10.您可以使用“查找泄漏嫌疑人”菜单找到可能的泄漏区域。

 

 

怀疑泄漏区域显示如下。

 

 

 

 

 

图标“,”表示它不是根对象/类,并且此节点有父项。

如果你想显示更多的父母,你可以选择菜单“显示更多的父母”

如果你想从根对象显示,你可以选择菜单“显示从根”

 

 

 

如果要查看所有名称相同的对象,请从菜单中选择“列出相同类型”:

 

 

以下是查询的结果:

 

 

通过点击鼠标右键,你可以在树形视图中找到一个特定的对象,你可以找到一个特定对象的父母或孩子。

 

 

11.显示按总尺寸排序的对象。

 

 

 

对象按总大小进行显示和排序。

 

 

通过点击鼠标右键,你可以在树形视图中找到一个特定的对象,你可以找到一个特定对象的父母和孩子。

 

 

如果您单击TotalSize的列标题,该列将按相反顺序排序。

 

 

 

12.列出按大小排序的对象

 

对象按大小排序,方法是单击“大小”列标题。

 

 

 

13.列出按子项数排序的对象

 

对象通过点击“否”子列标题按子项数进行排序。

 

 

点击地址栏标题按地址顺序排序对象。

 

 

单击对象列标题按字母顺序对对象进行排序。

 

 

 

您也可以将每列移动到不同的位置。Address列在下面的屏幕中移到了TotalSize列的旁边。

 

 

14.按大小排序的列表类型

 

 

 

类型按大小的总和排序。

 

 

通过单击鼠标右键,可以找到具有特定对象的相同名称的对象。

 

 

 

15.按频率/计数排序的列表类型

 

 

 

16.按字母顺序排列的列表类型

 

 

选择根目录来显示根对象。

 

 

所有的根对象显示如下:

 

 

 

通过点击鼠标右键,你可以在树形视图中找到一个特定的对象,你可以找到一个特定对象的相同类型,父母和孩子。

 

 

 

16.列出按大小排序的对象之间的间隔

 

 

 

以下是按大小查看对象之间的差距

 

 

 

17.显示差距统计。

 

 

 

差距分布图。不要认为差距是自由空间。差距实际上是两个对象之间的差距。Java堆转储没有任何有关它们的信息。

 

 

18.您可以通过选择查看 - >选项菜单来配置设置

 

 

 

 

 

 

19.搜索对象/类型并按总大小进行排序。

 

 

 

在正则表达式中输入对象/类型名称。大写/小写事项!

 

 

以下是名称中包含“字节”的类型列表。

 

 

 

20.搜索对象/类型并按大小排序。

 

 

 

以下是名称中有“字节”的类型列表,按照子项的数量排序。

 

 

通过点击鼠标右键,你可以在树形视图中找到一个特定的对象,你可以找到一个特定对象的相同类型,父母和孩子。

 

 

通过输入确切的名称,我们可以查看有关特定类型的详细信息。

例如,您可以输入一个类型的确切名称:byte []

 

 

 

以下是byte []类型的列表以及有关byte []的详细信息

列标题包含更多信息。

TotalSize的总和是117,712字节。总和的大小是117,712字节。

有140个字节的对象[]

 

 

您可以通过选择搜索地址找到一个特定的地址

 

 

输入一个对象的地址

 

 

以下是地址搜索的结果

 

 

通过点击鼠标右键,你可以在树形视图中找到一个特定的对象,你可以找到一个特定对象的相同类型,父母和孩子。

 

 

22.你可以隐藏/显示状态栏。

 

 

 

23.你可以隐藏/显示控制台。

 

 

来自HeapAnalyzer的异常/错误

 

· OutOfMemoryError 



将-Xmx增加到您的环境的最大可用大小。如果您在32位Java虚拟机上达到32位地址空间限制,则建议对大型Java堆转储使用64位Java虚拟机。在大多数情况下,对于Windows®操作系统上的32位Java虚拟机上的-Xmx,大小约为1500MB。例如,您可能希望将64位Java虚拟机用于文件大小为500MB的PHD Java堆转储。

· 线程“main”中的异常java.lang.NoClassDefFoundError:java / util / regex / PatternSyntaxException 



HeapAnalyzer需要Java虚拟机版本5或更高版本。

如果使用较早版本的Java虚拟机,则会引发异常:

· java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0 

在java.lang.String.charAt(未知源)

在com.ibm.jinwoo.heap.FileTask $ ActualTask​​。<init>(FileTask.java:386)

at com.ibm.jinwoo.heap.FileTask $ 1.construct(FileTask.java:794)

at com.ibm.jinwoo.heap.SwingWorker $ 2.run(SwingWorker.java:45)

at java.lang.Thread.run(Unknown Source )

处理损坏的heapdump或截断的内容时,您可以看到此异常。截断或损坏的heapdump不可靠。

· 异常在解析线9:0x0x50003070 [1000]的java /郎/字符串

了java.lang.RuntimeException 

在com.ibm.jinwoo.heap.FileTask $ ActualTask <初始化>(FileTask.java:321)。

在com.ibm.jinwoo .heap.FileTask $ 1.construct(FileTask.java:794)

at com.ibm.jinwoo.heap.SwingWorker $ 2.run(SwingWorker.java:45)

at java.lang.Thread.run(Unknown Source)



一些旧的IBM SDK在堆转储中生成无效的地址。用0x替换0x0x后,HeapAnalyzer可以处理堆转储。

· 解析第10行时出现格式错误:0x50004050 0x50004050 heapdump中的



意外格式。可能是已损坏的heapdump。进一步的分析是不可靠的。

 

文章来源:https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/W3b463571efc8_4f02_99af_3cbc0da42ddc/page/IBM%20HeapAnalyzer%20Information

原创粉丝点击