一、JFR 飞行记录器
Java Flight Recorder(JFR)是一个商业特性,用在生产服务器上是需要商业许可的。
JFR 记录了关于 Java 运行时及运行在其内的 Java 应用程序的详细信息,记录用少量的开销完成。数据是作为时间上的数据点(称为事件)记录的。典型的事件可以是线程等待锁、GC、CPU 周期使用数据等。
在创建飞行记录时,你可以选择哪些事件应当保存,这叫做记录模板。有些模板只保存基本事件,对性能几乎没有影响。其他模板可能有轻微的性能开销,还可能触发 GC 来收集更多信息。通常,超过百分之几的开销是很罕见。
飞行记录可用于调试很大范围的问题,从性能问题到内存泄漏或严重的锁竞争。
1、记录类型
1.1、连续录制
一个连续记录是指记录总是开着并保存,例如,过去六小时的数据。如果应用程序陷入问题,你可以转储(dump)这些数据,例如,从过去一小时的,看看出生问题时发生了什么。
连续记录的默认设置是使用记录 profile,开销极低。这个 profile 不收集堆统计信息或(内存)分配性能分析,但仍然收集了很多有用数据。
保持持续录制一直允许是很好的,对于调试非常罕见的问题时非常有用。记录可以用 jcmd
或 JMC
手工转储。你也可以在 JMC 里设置触发器在一些特定的条件被满足后转储飞行记录。
1.2、性能分析录制
性能分析录制是指记录开着,运行一定时间,然后停止。通常, 性能分析录制允许更多的时间,有可能对性能有较大的冲击。被开启的时间可以被修改,取决于你的 性能分析录制。
使用 性能分析录制 的典型场景如下:
- 剖析运行最频繁的方法和创建对象最多的地方。
- 查找使用了越来越多内存的类,暗示着内存泄漏。
- 查找因为同步而导致的瓶颈,更多类型的情景。
性能分析录制 将给出很多信息,即使你不是在定位特定的问题。 性能分析录制 将给你关于应用程序的很好的视图,可以帮助你找出瓶颈或需要提高的地方。
二、如何生成飞行记录
有三种方法可用于生成飞行记录:用 JMC 来生成飞行记录、用命令行启动标记来生成飞行记录、用触发器来自动录制。
2.1、用 JMC 来生成飞行记录
在 JDK 8u40 之前,JVM 必须带启动标记: -XX:+UnlockCommercialFeatures -XX:FlightRecorder
,从 JDK 8u40 开始,JFR 可以在运行时启用。
-
检查运行中的录制
如图:
对现有录制的操作:
-
转储连续录制
如上图,选择相应的转储选项即可:
-
开启新的录制
图中的 固定时间记录 就是性能剖析录制。
注意:典型的性能剖析录制的开销是 2%
。
默认设置在数据和性能之间有好的平衡。在有些情况下,你可能想添加额外的事件。例如,如果你在调查内存泄漏或想看看占据最多 Java 堆的对象,开启 堆统计。这将触发两个老年代收集,在录制开启和结束时,所以将引入一些额外的延迟。你也可以选择展示抛出的所有异常,即使是被捕获的。对于有的应用程序,这将生成很多事件。
Threshold 的值是录制事件的长度。例如,默认地,超过 10ms 的同步将生成事件。这意味着,如果一个线程等待一个锁超过 10 ms,一个事件被保存。你可以降低这个值来得到短竞争的更详细数据。
线程转储 设置给你一个周期地转储线程的选项。这些是普通的文本的线程转储。线程转储补足了事件。
2.2、用命令行启动标记来生成飞行记录
-
开始性能剖析录制
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=delay=20s,duration=60s,name=myrecording,filename=C:\TEMP\myrecording.jfr,settings=profile MyApp
表示 JVM 启动 20 秒后开始录制 60 秒,数据保存到C:\TEMP\myrecording.jfr
的性能剖析录制。
settings
参数要么是指向模板的路径或者名字,默认的模板位于jre/lib/jfr
文件夹。两个标准的 profiles 是:default,一个低开销的设置,用于连续录制; profile,收集更多数据,主要用于性能剖析录制。 -
开始连续录制
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,disk=true,repository=/tmp,maxage=6h,settings=default MyApp
数据被临时保存到 /tmp` 目录,保存最近 6 小时的数据,稍后可以转储出来。 -
使用诊断工具
还可以通过 Java 命令行诊断命令来控制录制。最简单的是用诊断工具jcmd
。
2.3、用触发器来自动录制
你可以设置 JMC 来自动开始或转储飞行记录,如果有条件匹配了,这可以通过 JMX 控制台完成。
你可以在应用程序的任意 MBean 上创建触发器。有一些默认的触发器设置用于普通条件,例如 CPU 使用情况,线程死锁,或大的存活集合。
在上图中, Action
选项卡表示条件匹配后要执行的动作。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。