HotSpot JVM 的任务控制和 Flight Recorder

  • Fabian Lange
  • 孙镜涛

2013 年 10 月 16 日

话题:JavaJVMDevOps语言 & 开发

从 Java 7 Update 40 之后,任务控制和 Flight Recorder 就将和 JDK 一起提供,正如InfoQ 在介绍它发布的新闻中所描述的那样。任务控制的出发点是监控、管理和排错,而 Flight Recorder 则是收集和评估性能数据的设施。这两个工具在 JRockit 中都已经存在,现在最终被移植到了 HotSpot 上,早在 2010 年 Mark Reinhold 发布的网络广播 中就有此暗示,而在JavaOne 2011上任务控制团队的领导者 Marcus 最终宣布了这一决定。在今年的 JavaOne 大会期间,Marcus Hirt 和 Staffan Larsen 在多个会议上介绍了它们的工作原理和利用方式。任务控制的版本号是 5.2.0,但是因为它实际上是针对 HotSpot 的第一个版本,所以 Marcus Hirt 喜欢称之为 1.0.0 版。

任务控制

任务控制提供的功能几乎和 JVisual VM 完全相同。这两个工具都能够连接到本地或者远程 Java 进程收集 JMX 数据。任务控制能够通过 Java 发现协议(Java Discovery Protocol)自动地发现远程运行的 JVM。为了使用该功能 JVM 需要通过下面的参数启动:-Dcom.sun.management.jmxremote.autodiscovery=true -Dcom.sun.management.jdp.name=JVM_Name。

和 JVisual VM 相似的是,任务控制也有一个插件机制,能够进行定制化。但是与 VisualVM 不同的是,任务控制还能够在收集的数据上创建新的视图。现在能够使用的两个实验性的插件是 JOverflow 堆分析器(查找低效的集合使用)和 DTrace 记录器(关联 DTrace 配置文件)。任务控制拥有一个 JMX 浏览器作为它核心功能的一部分,同时提供了稍微更加强大的功能。例如,线程监控能够提供每一个线程的分配信息以及与堆栈跟踪相关的信息。因为任务控制是基于 Eclipse 平台的,所以它不仅能够作为 JDK 中的独立工具使用,还能够作为 Eclipse 插件从 Oracle 任务控制更新网站上获取。

Flight Recorder

想要在 JVM 之外收集调试数据、特别是性能数据的工具需要实现 JVMPI/JVMTI 接口。虽然大部分分析工具发展的非常良好,但是让它们能够在产品中低消耗地运行依然是非常困难的。

Flight Recorder 直接在 JVM 中实现了它自己的基于事件的监控接口,所以能够以最小的开销提供 CPU 时间或者对象分配分析这样的功能。例如,这个新接口允许采取线程的样本但不需要它们在还原点上,降低了开销和测量的偏差。只有少量使用字节码检测的事件对运行的代码有影响。大部分捕获技术是新的,第三方无法使用。Flight Recorder 在 JVM 本地记录数据,但是是记录在堆外(off-heap),因此它并不会影响内存特性和垃圾收集。当它被配置成持久化数据的时候,它会周期性地倾倒(dump)到一个文件中。

收集的数据主要包含 4 种类型的事件:“瞬间(instant”,在事件发生时进行记录;“可请求的(requestable”,它们会被轮循;“持续(duration”,表示一个时间间隔的度量;“定时的(timed”,它们和“持续”一样,但是对过滤数据应用了阀值。有两个预定义的配置:“连续性(continuous”,它的目的是始终运行;“剖析(profiling)”,它会收集更多的数据以便进行短期分析。但是无论如何开销始终都非常低,除非明确地声明一个事件。

除了 JVM 生成的事件之外,还鼓励框架和应用程序服务器提供自己的事件。目前并不支持接口,但是 Weblogic 和 Glassfish 已经提供了事件,它们基本上成为了事实上的接口。Marcus Hirt 在他的博客文章“使用 (非常不支持的) Java Flight Recorder API”中介绍了如何使用 API。基本的步骤是扩展合适的 Event 类,通过添加注解表明值,然后从事件产生的代码中调用它。自定义的事件和其他事件并没有什么不同,也能够使用、创建仪表盘并随着其他的事件一起绘制。该版本包含的其他重要功能的细节信息可以从 Marcus Hirt的另一篇博客中找到。

许可

为了使用 Flight Recorder,服务器 VM 需要使用下面的参数启动:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder 。这已经表明这些新功能需要一个许可。但是并没有进行技术性的检查,所以许可文件并不是必须的。实际上许可是一个契约性的协议,它需要 Java SE Advanced 或者 Java SE Suite,根据Oracle 的价格表在产品系统中它的售价是每个处理器 5k/15k 美元。测试或者开发系统并不需要许可,但是依然需要 UnlockCommercialFeatures 标记。任务控制本身是否需要一个许可并不明确。文档中暗示了它也能在 OpenJDK VM 上免费使用,只要任务控制不要在需要每个处理器许可的产品系统上运行即可。希望 Oracle 能够澄清这个状况。

未来

由于任务控制和 Flight Recorder 现在在 HotSpot 中,所以开发的焦点将会是如何添加插件从而能够自动地指出性能问题,例如内存泄漏检测器(Memory Leak Detector)和构建启发式的工具。之前已经讨论过 JConsole 和 VisualVM 的未来,它们与任务控制有一定的重叠。它们很有可能会被保留,因为它们是 OpenJDK 的一部分,而任务控制并不是。如果 Oracle 采取的策略和 VisualVM 替代 JConsole 时的策略相同,那么 JConsole 和 JVisual VM 很有可能会保留下来,但是开发的焦点将会放在任务控制上。Jack Shirazi 在他的Java 性能调教简讯中推测 JConsole 将会退役,而 Kirk Pepperdine 则评论说他相信任务控制将会转移到 Netbeans 平台,类似于 VisualVM。Marcus Hirt 告诉 InfoQ 说没有这样的计划。

查看英文原文Mission Control and Flight Recorder on HotSpot JVM

JavaJVMDevOps语言 & 开发