Java Flight Recordings (JFR) — Java 飞行记录器 – part 1

一、JFR 飞行记录器

Java Flight Recorder(JFR)是一个商业特性,用在生产服务器上是需要商业许可的。

JFR 记录了关于 Java 运行时及运行在其内的 Java 应用程序的详细信息,记录用少量的开销完成。数据是作为时间上的数据点(称为事件)记录的。典型的事件可以是线程等待锁、GC、CPU 周期使用数据等。

在创建飞行记录时,你可以选择哪些事件应当保存,这叫做记录模板。有些模板只保存基本事件,对性能几乎没有影响。其他模板可能有轻微的性能开销,还可能触发 GC 来收集更多信息。通常,超过百分之几的开销是很罕见。

飞行记录可用于调试很大范围的问题,从性能问题到内存泄漏或严重的锁竞争。

1、记录类型

1.1、连续录制

一个连续记录是指记录总是开着并保存,例如,过去六小时的数据。如果应用程序陷入问题,你可以转储(dump)这些数据,例如,从过去一小时的,看看出生问题时发生了什么。

连续记录的默认设置是使用记录 profile,开销极低。这个 profile 不收集堆统计信息或(内存)分配性能分析,但仍然收集了很多有用数据。

保持持续录制一直允许是很好的,对于调试非常罕见的问题时非常有用。记录可以用 jcmdJMC 手工转储。你也可以在 JMC 里设置触发器在一些特定的条件被满足后转储飞行记录。

1.2、性能分析录制

性能分析录制是指记录开着,运行一定时间,然后停止。通常, 性能分析录制允许更多的时间,有可能对性能有较大的冲击。被开启的时间可以被修改,取决于你的 性能分析录制。

使用 性能分析录制 的典型场景如下:

  • 剖析运行最频繁的方法和创建对象最多的地方。
  • 查找使用了越来越多内存的类,暗示着内存泄漏。
  • 查找因为同步而导致的瓶颈,更多类型的情景。

性能分析录制 将给出很多信息,即使你不是在定位特定的问题。 性能分析录制 将给你关于应用程序的很好的视图,可以帮助你找出瓶颈或需要提高的地方。

二、如何生成飞行记录

有三种方法可用于生成飞行记录:用 JMC 来生成飞行记录、用命令行启动标记来生成飞行记录、用触发器来自动录制。

2.1、用 JMC 来生成飞行记录

在 JDK 8u40 之前,JVM 必须带启动标记: -XX:+UnlockCommercialFeatures -XX:FlightRecorder,从 JDK 8u40 开始,JFR 可以在运行时启用。

  1. 检查运行中的录制
    如图:jmc-jfr
    对现有录制的操作:
    jmc-jfr-op

  2. 转储连续录制
    如上图,选择相应的转储选项即可:
    jfr-dump

  3. 开启新的录制
    jfr-start-recording
    图中的 固定时间记录 就是性能剖析录制。

注意:典型的性能剖析录制的开销是 2%

默认设置在数据和性能之间有好的平衡。在有些情况下,你可能想添加额外的事件。例如,如果你在调查内存泄漏或想看看占据最多 Java 堆的对象,开启 堆统计。这将触发两个老年代收集,在录制开启和结束时,所以将引入一些额外的延迟。你也可以选择展示抛出的所有异常,即使是被捕获的。对于有的应用程序,这将生成很多事件。

Threshold 的值是录制事件的长度。例如,默认地,超过 10ms 的同步将生成事件。这意味着,如果一个线程等待一个锁超过 10 ms,一个事件被保存。你可以降低这个值来得到短竞争的更详细数据。

线程转储 设置给你一个周期地转储线程的选项。这些是普通的文本的线程转储。线程转储补足了事件。

2.2、用命令行启动标记来生成飞行记录

  1. 开始性能剖析录制
    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,收集更多数据,主要用于性能剖析录制。

  2. 开始连续录制
    java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,disk=true,repository=/tmp,maxage=6h,settings=default MyApp
    数据被临时保存到 /tmp` 目录,保存最近 6 小时的数据,稍后可以转储出来。

  3. 使用诊断工具
    还可以通过 Java 命令行诊断命令来控制录制。最简单的是用诊断工具 jcmd

2.3、用触发器来自动录制

你可以设置 JMC 来自动开始或转储飞行记录,如果有条件匹配了,这可以通过 JMX 控制台完成。
jfr-automatic-trigger

你可以在应用程序的任意 MBean 上创建触发器。有一些默认的触发器设置用于普通条件,例如 CPU 使用情况,线程死锁,或大的存活集合。

jfr-automatic-trigger-setup
在上图中, Action 选项卡表示条件匹配后要执行的动作。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据