支持JDK Flight Recorder (JFR)
JDK Flight Recorder (JFR) 是一个结构化的日志记录工具,记录广泛的系统级事件。类似于飞机的黑匣子,持续记录飞行数据以用于事件调查,JFR持续记录JVM中的事件流以用于诊断问题。这种方法的优势在于,它可以按时间顺序捕获系统在事件发生前的详细信息。JFR设计为对性能影响最小,并且可以安全地在生产环境中长时间运行。
从Java 17开始,JFR也是JProfiler的数据源之一。除了使用JVM分析接口的本机代理外,JVM中还有一些在分析上下文中感兴趣的高级系统。一个是MBean系统,它为JProfiler中的一些遥测提供数据,另一个是用于垃圾收集器探针的JFR。为此,您无需与JFR交互,JProfiler会透明地处理JFR事件流。
JProfiler中的JFR集成
JProfiler完全集成了JFR记录,因此您可以轻松捕获本地机器或未配置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中收集的跟踪大小,并消除应用程序中截断的跟踪。