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”是一个堆分析工具,它会解析Java heap dump 并且能够在Web 浏览器中查看解析过的heap dump。借助“jhat”,用户可以执行一些标准的查询或使用 OQL 接口编写自定义的查询。
按照JEP 241, jhat 是一个实验性的、不再支持的过时工具。尽管JEP 并没有指定特定的替代工具,但是InfoQ 还是再次为用户推荐 Java VisualVM ,用它来实现heap dump 的创建、可视化和分析。VisualVM 还允许用户执行自定义的查询或使用标准的查询。
在未来的报道中,我们将会继续讨论上述的使用场景。
评论