jhat
是 Java Development Kit(JDK)
自带的一个工具,用于分析Java堆转储文件(即 Heap Dump
)。它的设计目的是为了帮助开发人员分析和调试Java应用程序在运行时产生的内存问题。
jhat
命令可以将Java堆转储文件加载到内存中,并在网页浏览器中提供一个交互式的界面进行查看和分析。它允许开发人员浏览对象图、查找内存泄漏以及分析内存使用情况等。
jhat
可以显示Java堆转储文件中的所有类和实例对象。它能够根据对象之间的引用关系构建对象图,清晰展示对象之间的关系。开发人员可以通过搜索和过滤功能查找特定类型的对象或者根据引用关系查找内存泄漏等问题。
jhat
命令在加载堆转储文件时会将数据解析并放入Java虚拟机的内存中。通过使用Java虚拟机自带的工具包(如java.util.WeakHashMap
等),jhat
能够构建对象图和跟踪引用关系,提供可视化界面进行交互式分析。
优点:
缺点:
jhat
命令的输出结果可能过于详细,需要开发人员具备一定的内存分析经验来解读结果。jconsole
命令的使用语法如下:
Usage:
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
对于命令中各部分的解释如下:
参数 | 说明 |
---|---|
-J |
将参数直接传递到运行时系统。例如,-J-mx512m 使用512MB的最大堆大小 |
-stack false |
关闭跟踪对象分配调用堆栈 |
-refs false |
关闭对对象引用的跟踪 |
-port |
设置HTTP服务器的端口。默认值为7000 |
-exclude |
指定一个文件,该文件列出了应从reachableFrom查询中排除的数据成员 |
-baseline |
指定基准对象转储。两个堆转储中具有相同ID和相同类的对象将被标记为非“新”对象 |
-debug |
设置调试级别。(0:没有调试输出、1:调试hprof文件解析、2:调试hprof文件解析,无服务器) |
-version |
报告版本号 |
-h|-help |
打印命令帮助信息并退出 |
|
要读取的文件 |
对于包含多个堆转储的转储文件,可以指定文件中的转储,通过在文件名后面加上“#
”实现,例如“foo.hprof#3
”。所有有布尔值的参数选项默认为“true
”。
-XX:+HeapDumpOnOutOfMemoryError
参数,当出现OutOfMemoryError
时会自动生成堆转储文件;jhat
命令加载堆转储文件,并在浏览器中打开相关URL以查看分析结果。在分析时可使用搜索、过滤等功能来定位问题;jhat
的启动性能和减少内存占用。例如:
jhat -J-Xmx1g
:增加jhat
的最大堆空间限制(默认为64MB),例如将其设为1GB(1g);jhat -J-XX:PermSize=256m -J-XX:MaxPermSize=512m
:增加持久代(PermGen
)的空间限制。下面是一个使用jhat
命令的简单案例:
启动应用,配置发生内存错误时生成堆转储文件:
java -XX:+HeapDumpOnOutOfMemoryError -Xmx512m -jar MyApp.jar
上述命令会在应用程序发生内存溢出错误时自动生成堆转储文件。
执行jhat
命令加载堆转储文件:
jhat heapdump.hprof
运行上述命令将会启动jhat
服务器,并加载堆转储文件。输出信息会提示服务器监听的端口号。
在浏览器中访问jhat
分析界面:
http://localhost:7000/
在浏览器的地址栏中输入上述URL
,其中端口号要与jhat
的输出一致。这将打开一个网页界面,展示了堆转储文件的可视化分析结果。
使用 jhat
进行分析:
以上案例展示了如何使用jhat
命令加载和分析Java堆转储文件。通过浏览器界面,开发人员可以方便地查看对象图、搜索过滤对象以及分析内存使用情况,从而定位和解决Java应用程序的内存问题。
需要注意的是,jhat
命令在处理大型堆转储文件时可能会占用较多的内存和计算资源,请确保足够的系统资源。
由于jhat
的输出结果可能非常详细且复杂,对于初学者可能需要一些时间来熟悉其功能和解读分析结果。
jhat
命令是Java开发工具包(JDK)中的一个强大工具,用于分析和调试Java应用程序的内存问题。通过加载Java堆转储文件,jhat
提供了一个交互式的可视化界面,帮助开发人员浏览对象图、查找内存泄漏和分析内存使用情况。尽管jhat
在处理大型堆转储文件时可能会占用较多内存,但它仍然是一个强大而有用的工具,适合于解决各种与内存相关的问题。