HotSpot JVM 和 Android Runtime 都支持 HPROF 格式的堆快照。 IBM J9 JVM 则将此类快照写入为 PHD 格式。PHD 文件不包含垃圾回收器根(garbage collector roots), 因此 JProfiler 将类模拟为根。使用 PHD 文件查找类加载器 (classloader) 内存泄漏可能会比较困难。
原生堆快照可以在不加载 profiling agent 的情况下保存,且开销低于 JProfiler 堆快照,因为它们在保存时不受通用 API 的限制。另一方面, 原生堆快照支持的功能少于 JProfiler 堆快照。例如,分配 (allocation) 记录信息不可用, 因此您无法查看对象是在何处分配 (allocated) 的。HPROF 和 PHD 快照可以通过 Session→Open Snapshot 在 JProfiler 中打开,就像打开 JProfiler 快照一样。此时仅 Heap Walker 可用,所有其他部分都将呈灰色禁用状态。
在实时会话 (session) 中,您可以通过调用
Profiling→Save HPROF Snapshot 或
Profiling→Save PHD Snapshot 操作来创建并打开 HPROF/PHD 堆快照。对于
离线 profiling,提供了一个“Create an HPROF/PHD heap dump”触发器 (trigger) 操作。
它通常与“Out of memory exception”触发器 (trigger) 结合使用,以便在抛出
OutOfMemoryError 时保存 HPROF 快照。
这对应于 HotSpot JVM 支持的 VM 参数
-XX:+HeapDumpOnOutOfMemoryError
。
从运行中的系统提取 HPROF 堆 dump 的另一种方法是通过 JDK 包含的命令行工具
jmap。其调用语法
jmap -dump:live,format=b,file=<filename> <PID>
很难记忆,并且需要您先使用 jps 可执行文件来查找
PID。JProfiler 自带了一个交互式命令行可执行文件
bin/jpdump,使用起来方便得多。它允许您选择进程,可以连接到 Windows 上作为服务运行的进程,
完美兼容 32 位/64 位混合 JVM,并能自动为 HPROF 快照文件编号。使用
-help 选项执行它可以获取更多信息。
JProfiler GUI 中也支持在不加载 profiling agent 的情况下获取 HPROF 堆快照。 在本地或远程 Attach 到进程时,您始终可以选择仅获取 HPROF 堆快照。
HPROF 快照可以包含线程 dump。当 HPROF 快照是由于
OutOfMemoryError 而保存时,线程 dump 或许能够传达在发生错误时应用程序的哪一部分处于活动状态。触发该错误的线程会用特殊图标标记。





