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