OpenJDK 9:将会移除 HPROF 和 jhat

  • Monica Beckwith
  • 张卫滨

2015 年 12 月 18 日

话题:Java语言 & 开发架构

OpenJDK 正在从 JDK 中废弃 HPROF agent 并移除“jhat”工具。这是 OpenJDK 9 的 Java SE 平台借助 Jigsaw 实现模块化的结果,为了准备模块化,起草了多项提议(JEP),并且其中有很多都已经接近完成了。

让我们近距离地了解一下这两个与模块化 JDK 相关的 JEP,它们的目标就在于移除 HPROF agent 和“jhat”工具:

移除 JVM Tool Interface HPROF Agent

HPROF 是一个 profiler agent,它使用 JVM Tool Interface(JVMTI)来提供工具接口,并且用到了 Bytecode Instrumentation。HPROF agent 能够将 profiling 信息写到文件中,这些信息包括基于 allocation sites 的堆使用情况、堆 dump、CPU 使用情况、争用监控等,它还可以将这些信息通过 socket 进行发送。HPROF无意成为生产型的工具,它能够被下文所述的各种其他可选方案所替代:

HPROF 能够获取 heap allocation profile、CPU 使用的采样数据以及 times profile,按照其最简单的形式分别如下面的命令所示:

java -agentlib:hprof=heap=sites <classname>

java -agentlib:hprof=cpu=samples <classname>

java -agentlib:hprof=cpu=times <classname>

相应的功能可以通过 Java 性能监控工具VisualVM来实现,这是一个可视化的工具,集成了多个命令行 JDK 工具和轻量级 profiling 功能。与 HPROF 不同,VisualVM 能够用在生产以及开发环境中,并且提供了额外的特性,如生成线程(和堆)dump、查看 heap dump、本地和远程的 Java 应用监控以及离线性能分析等等。

HPROF 也能通过如下的命令生成 heap dump:

java -agentlib:hprof=heap=dump <classname>

按照JEP 240,这个功能将会被 JVM 中相同的功能所取代,这是通过使用像“jcmd”和“jmap”这样的命令行工具做到的,如下所示:

jcmd GC.heap_dump filename=<filename>

或者

jmap [option] <pid>

where <option>:

-dump:<dump-options> to dump java heap in hprof binary format

            dump-options:

             live         dump only live objects; if not specified,

                          all objects in the heap are dumped.

             format=b     binary format

             file=<file>  dump heap to <file>

Example: jmap -dump:live,format=b,file=heap.bin <pid>

按照“jcmd”工具的文档,如果要创建堆(hprof)dump 的话,“jcmd”是推荐使用的工具。

移除“jhat”工具

“jhat”是一个堆分析工具,它会解析 Java heap dump 并且能够在 Web 浏览器中查看解析过的 heap dump。借助“jhat”,用户可以执行一些标准的查询或使用 OQL 接口编写自定义的查询。

按照 JEP 241, jhat 是一个实验性的、不再支持的过时工具。尽管 JEP 并没有指定特定的替代工具,但是 InfoQ 还是再次为用户推荐 Java VisualVM ,用它来实现 heap dump 的创建、可视化和分析。VisualVM 还允许用户执行自定义的查询或使用标准的查询。

在未来的报道中,我们将会继续讨论上述的使用场景。

查看英文原文:OpenJDK 9: Life Without HPROF and jhat

Java语言 & 开发架构