JAX London:使用Java飞行记录器实现生产环境的性能

在今年的JAX London上,来自甲骨文Java平台组的Ola Westin介绍了Java任务控制(Java Mission Control,JMC)和Java飞行记录器(Java Flight Recorder,JFR)的功能。

Westin首先在整体上介绍了JMC和JFR,然后为观众展示了如何创建和分析记录(recording)并为观众提供了一个样例。在本文中,InfoQ将会带领读者回顾Westin的演讲。

JAX London:使用Java飞行记录器实现生产环境的性能

Java任务控制概览

Java任务控制是一个图形化的界面,它借助JMX控制台(提供了服务器的原始视图)和Java飞行记录器(Java Flight Recorder)(收集、分析和诊断应用的数据)的帮助,能够可视化Java虚拟机(Java VM)的行为。

JMC(jmc命令)打包在了Java开发工具集中(JDK),位于bin目录下。额外的日志可以通过使用 –consoleLog –debug选项来启用。各种体验式的插件(比如针对DTrace、JMX控制台的插件)也可以进行在JMC中进行下载。

Java飞行记录器概览

Java飞行记录器会收集Java应用程序以及Java VM的行为信息。JFR构建在了Java VM之中,能够为用户提供运行时的信息。使用JFR并不会影响其他的Java VM优化,它的最小开销会小于2%。

JFR有不同的事件,比如即时事件(instant event)、持续事件(duration event)以及可请求事件(request-able event)。即时事件只会在某个时间点发生(比如线程启动),因此它的开销最小,但是持续事件(如垃圾收集等)是基于阈值的,与之类似,可请求事件(比如方法分析采样)基于可配置的时间段,因此这些事件的开销差异很大。

JFR的采样性能分析器并不需要线程处于安全点上,也不会记录每个方法的调用(它只会探测热点方法)。按照该演讲所述,对于调用原生方法的线程,并没有与之相关的采样。

有两种不同类型的记录:固定时间(性能分析)的记录以及持续的记录,它们都会dump到一个文件中。

创建记录

要使用JFR来创建记录,我们需要在启动JVM的时候添加如下的命令行选项:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

从Java 8 update 40开始,我们还可以在运行时通过JMC或者jcmd方案来创建JFR记录。

如下的三幅图片分别展现了如何利用上述的三种方案来创建JFR记录。

JAX London:使用Java飞行记录器实现生产环境的性能

JAX London:使用Java飞行记录器实现生产环境的性能

JAX London:使用Java飞行记录器实现生产环境的性能

我们还可以按照下图的方式记录远程的系统:

JAX London:使用Java飞行记录器实现生产环境的性能

分析记录

在演讲中,Westin强调在进行任何的深入调查之前,提出正确问题是非常重要的。接下来他给出了一个样例,这个样例阐述了“热点方法”的问题,如下所示:

JAX London:使用Java飞行记录器实现生产环境的性能

在这里,当“Hot Methods” tab选中的时候,我们可以看到LinkedList.indexOf(Object)占据了总采样数量的97.35%。在深入研究调用栈的时候,我们发现在链式列表中有一个contains(Object)方法,这个方法需要O(n)的迭代。为了解决这个问题,Westin运行了另外一个JFR记录,将LinkedList替换为HashSet,它的结果如下所示:

JAX London:使用Java飞行记录器实现生产环境的性能

随后,Westin又介绍了两个样例:其中一个是关于线程竞争的,另一个是因为自动装箱所导致的内存分配。最后,他进行了总结展望,相关的slide如下所示:

JAX London:使用Java飞行记录器实现生产环境的性能

查看英文原文JAX London: Production Time Profiling Using Java Flight Recorder

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/69d9f682a02e468af922541f94e53f8b.html