HPROF 和 PHD 堆快照
HotSpot JVM 和 Android Runtime 都支持 HPROF 格式的堆快照,IBM J9 JVM 以 PHD 格式写入此类快照。PHD 文件不包含垃圾收集器根,因此 JProfiler 将类模拟为根。使用 PHD 文件查找类加载器内存泄漏可能会很困难。
本机堆快照可以在没有分析代理的情况下保存,并且比 JProfiler 堆快照的开销更低,因为它们是在没有通用 API 约束的情况下保存的。另一方面,本机堆快照支持的功能比 JProfiler 堆快照少。例如,分配记录信息不可用,因此您无法查看对象的分配位置。HPROF 和 PHD 快照可以在 JProfiler 中通过会话→打开快照打开,就像打开 JProfiler 快照一样。只有堆遍历器可用,所有其他部分将被灰显。
在实时会话中,您可以通过调用分析→保存 HPROF/PHD 堆快照创建并打开 HPROF/PHD 堆快照。对于离线分析,有一个“创建
HPROF 堆转储”触发器动作。通常与“内存不足异常”触发器一起使用,以便在抛出OutOfMemoryError
时保存 HPROF 快照。
这对应于 VM 参数
-XX:+HeapDumpOnOutOfMemoryError
由 HotSpot JVM 支持。
从正在运行的系统中提取 HPROF 堆转储的另一种方法是通过命令行工具,它是 JRE 的一部分。其调用语法
jmap
jmap -dump:live,format=b,file=<filename> <PID>
很难记住,并且需要您首先使用可执行文件来找出 PID。JProfiler
附带一个交互式命令行可执行文件 jps
,它更加方便。它允许您选择一个进程,可以连接到在 Windows 上作为服务运行的进程,对混合 32 位/64 位 JVM
没有问题,并且自动编号 HPROF 快照文件。使用 bin/jpdump
-help
选项执行它以获取更多信息。
在不加载分析代理的情况下拍摄 HPROF 堆快照也在 JProfiler GUI 中得到支持。当附加到进程时,无论是本地还是远程,您始终可以选择仅拍摄 HPROF 堆快照。
HPROF 快照可以包含线程转储。当 HPROF 快照因OutOfMemoryError
而保存时,线程转储可能能够传达应用程序在错误发生时处于活动状态的部分。触发错误的线程用一个特殊的图标标记。