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快照。

这对应于HotSpot JVM支持的

VM参数

-XX:+HeapDumpOnOutOfMemoryError

另一种从运行中的系统中提取HPROF堆转储的方法是通过命令行工具jmap,它是JRE的一部分。 它的调用语法

jmap -dump:live,format=b,file=<filename> <PID>

是很难记住的,需要你先使用jps 可执行文件来找出PID。 JProfiler附带了一个交互式的命令行可执行文件bin/jpdump,更加方便。 它可以让你选择一个进程,可以连接到Windows上作为服务运行的进程,对32位/64位混合的JVM没有问题,并且自动编号HPROF快照文件。 用-help 选项执行它,以获得更多信息。

在JProfiler GUI中也支持在不加载分析代理的情况下生成HPROF堆快照。 当本地或远程Attach到一个进程时,你总是有可能只获取HPROF堆快照。

HPROF快照可以包含线程转储。当HPROF快照在触发OutOfMemoryError 时被保存, 线程转储可能会传达出错误发生时应用程序的哪个部分处于活动状态。触发错误的线程会用一个特殊的图标标记。