支持飞行记录器(JFR)
JDK飞行记录器(JFR)是一种结构化日志记录工具, 它记录广泛的系统级(system-level)事件。类似于飞机上的黑盒子,它会持续记录飞行数据,用于调查飞行事故。JFR会持续记录JVM中的 一系列事件,用于诊断问题。这种方式的优势是,它会按时间顺序,捕获导致事故的,详细系统信息。JFR被设计的,对于性能影响很小,所以 可以安全地在生产环境长时间运行。
从Java 17 开始,JFR也成为了JProfiler的数据源的一员。除了使用JVM分析接口的本地代理,在分析过程中,还有一些 JVM中的高级(high-level)系统需要关注。其中之一,为JProfiler中一些遥测提供数据的MBean系统,另一个是用于 垃圾回收器探针的JFR。为此,你不需要与JFR交互,JProfiler会以透明的方式处理 JFR事件流。
JProfiler中的JFR集成
JProfiler全面集成了JFR记录,因此,你可以轻易捕获本地机器上运行的JVM的数据, 或远程机器上运行的但是没有配置JFR记录的JVM数据。
当你在JProfiler UI中打开一个JFR快照时,可用视图和结构,与常规分析会话中的不一样。UI的中心是 事件浏览器。JFR视图中的其他可用视图 在另一个章节介绍
当你处理事件类型、设置过滤器和查看分析时,JProfiler偶尔需要重新扫描JFR快照文件。JFR快照文件有时候非常大,在内存中存放所有文件或 提前计算所有分析,行不通。因此,不建议打开存放在网络驱动器中的JFR快照。
当你打开很大的JFR快照时,你可以通过点击文件选择器中的“自定义分析”复选框,然后排除你的分析中不需要的“事件分类”,来加快处理快照 ,减少内存利用率。可用事件分类覆盖单个探针和视图部分。CPU视图、内存视图和遥测视图的事件类型是必须要被加载的,不是可选的。
例如,如果你只对CPU数据感兴趣,你可以排除所有探针以及事件浏览器。JProfiler的目标是成为最快的JFR查看器,可以快速打开常见的JFR快照, 但是JFR记录的数据大小有可能是没有限制的,你可能会面对一个几十个GB大小的快照,这时候打开速度可能会成为一个问题。
JFR快照中的堆栈跟踪
JFR的一个重要能力是,可以高效地记录特定事件类型的整个堆栈跟踪。对于此类事件类型,你可以在JFR设置中切换堆栈跟踪记录。 许多JVM应用事件类型,尤其是与线程有关的这些,默认开启了堆栈跟踪记录。
JFR收集堆栈跟踪,只到一个固定深度,所以较长的堆栈跟踪会被截断。截断的堆栈跟踪不适合构建一个可理解的调用树,所以 这些跟踪会显示在一个被特殊标记节点的下方。 通过
-XX:FlightRecorderOptions=stackdepth=<nnnn>
VM参数,你可以增加JFR中收集的跟踪的大小,这样你的应用程序可以摆脱截断的跟踪。