一、JFR 飞行记录器
Java Flight Recorder(JFR)是一个商业特性,用在生产服务器上是需要商业许可的。
JFR 记录了关于 Java 运行时及运行在其内的 Java 应用程序的详细信息,记录用少量的开销完成。数据是作为时间上的数据点(称为事件)记录的。典型的事件可以是线程等待锁、GC、CPU 周期使用数据等。
在创建飞行记录时,你可以选择哪些事件应当保存,这叫做记录模板。有些模板只保存基本事件,对性能几乎没有影响。其他模板可能有轻微的性能开销,还可能触发 GC 来收集更多信息。通常,超过百分之几的开销是很罕见。
飞行记录可用于调试很大范围的问题,从性能问题到内存泄漏或严重的锁竞争。
1、记录类型
1.1、连续录制
一个连续记录是指记录总是开着并保存,例如,过去六小时的数据。如果应用程序陷入问题,你可以转储(dump)这些数据,例如,从过去一小时的,看看出生问题时发生了什么。
连续记录的默认设置是使用记录 profile,开销极低。这个 profile 不收集堆统计信息或(内存)分配性能分析,但仍然收集了很多有用数据。
保持持续录制一直允许是很好的,对于调试非常罕见的问题时非常有用。记录可以用 jcmd
或 JMC
手工转储。你也可以在 JMC 里设置触发器在一些特定的条件被满足后转储飞行记录。
1.2、性能分析录制
性能分析录制是指记录开着,运行一定时间,然后停止。通常, 性能分析录制允许更多的时间,有可能对性能有较大的冲击。被开启的时间可以被修改,取决于你的 性能分析录制。
使用 性能分析录制 的典型场景如下:
- 剖析运行最频繁的方法和创建对象最多的地方。
- 查找使用了越来越多内存的类,暗示着内存泄漏。
- 查找因为同步而导致的瓶颈,更多类型的情景。
性能分析录制 将给出很多信息,即使你不是在定位特定的问题。 性能分析录制 将给你关于应用程序的很好的视图,可以帮助你找出瓶颈或需要提高的地方。