拓冰建站拓冰建站
首页 / 资讯中心 / 正文

GraalVM Native Image 中的 JDK Flight Recorder(JFR)使用指南:构建、配置与事件采集

GraalVM Native Image 中的 JDK Flight RecorderJFR使用指南构建、配置与事件采集【免费下载链接】graalGraalVM compiles applications into native executables that start instantly, scale fast, and use fewer compute resources 项目地址: https://gitcode.com/gh_mirrors/gr/graalJDK Flight RecorderJFR是 JVM 内置的事件记录器用于采集 JVM 与应用程序的运行信息。GraalVM Native Image 支持构建包含 JFR 事件采集能力的原生可执行文件开发者可以使用标准的jdk.jfr.EventAPI 获得与 HotSpot JVM 上近乎一致的体验。本文将围绕 Native Image 的 JFR 支持系统讲解构建期如何开启、运行期如何启动录制、录制参数与系统日志如何配置并结合仓库源码剖析采样器、内置事件与 jcmd/JMX 等高级用法帮助你为原生镜像应用建立起完整的可观测能力。在构建期启用 JFR 支持并在运行期录制事件JFR 支持在默认情况下是关闭的必须在构建原生可执行文件时显式开启。构建时使用--enable-monitoringjfr选项即可native-image --enable-monitoringjfr JavaApplication--enable-monitoring是 Native Image 的统一监控功能开关jfr只是其取值之一。除了jfr之外该选项还支持jcmd、heapdump、nmt、jvmstat等其他监控能力并且可以逗号分隔组合使用例如--enable-monitoringjfr,jcmd。这样在构建期一次性启用的多个监控功能会在运行期为原生可执行文件解锁更多诊断命令详见后文 jcmd 一节。构建期开启 JFR 后运行期通过以下两个运行时选项进行录制与日志配置-XX:StartFlightRecording在应用程序启动时开始一次 JFR 录制-XX:FlightRecorderLogging配置 JFR 系统的日志输出启动一次录制最简单的方式是在运行原生可执行文件时传入-XX:StartFlightRecording例如./javaapplication -XX:StartFlightRecordingfilenamerecording.jfr以仓库中 JFR 实战指南 的完整流程为例你可以先编写一个使用jdk.jfr.EventAPI 的自定义事件import jdk.jfr.Event; import jdk.jfr.Description; import jdk.jfr.Label; public class JFRDemo { Label(Hello World) Description(Build and run a native executable with JFR.) static class HelloWorldEvent extends Event { Label(Message) String message; } public static void main(String... args) { HelloWorldEvent event new HelloWorldEvent(); event.message Hello, World!; event.commit(); } }然后依次执行编译、构建与运行三步javac JFRDemo.java # 编译生成 JFRDemo.class 与 JFRDemo$HelloWorldEvent.class native-image --enable-monitoringjfr JFRDemo # 构建带 JFR 支持的原生可执行文件 jfrdemo ./jfrdemo -XX:StartFlightRecordingfilenamerecording.jfr # 运行并启动录制输出到 recording.jfr在 Windows 上运行对应的jfrdemo.exe时使用相同的-XX:StartFlightRecording选项即可。录制完成后可以使用 VisualVMFile → Add JFR Snapshot打开.jfr文件查看事件内容也可以在控制台直接查看jfr print recording.jfr该命令会打印 Flight Recorder 记录到的全部事件。配置 JFR 录制StartFlightRecording 的键值对与 HotSpot 上的使用方式类似你可以向-XX:StartFlightRecording传递一个逗号分隔的键值对列表来精细控制录制行为例如-XX:StartFlightRecordingfilenamerecording.jfr,dumponexittrue,duration10s支持的键值对如下表所示。这些参数与仓库中substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/doc-files/StartFlightRecordingHelp.txt记录的使用说明完全一致NameDefault ValueDescriptionnamenone用于标识录制的名称例如nameMyRecordingsettingsnone设置文件profile.jfc、default.jfc等例如settingsmyprofile.jfcdelaynone延迟录制启动单位支持 (s)秒、(m)分、(h)时、(d)天例如delay5hdurationinfinite (0)录制持续时长单位同上例如duration300s默认 0 表示无限期filenamenone录制结果文件名例如filenamerecording1.jfrmaxageno limit (0)磁盘上保留录制数据的最长时间单位同上例如maxage1d0 表示不限maxsizeno limit (0)磁盘上保留数据的最大字节数单位支持 (k)B、(M)B、(G)B例如maxsize1G0 表示不限dumponexitfalse是否在 JVM 关闭时转储正在进行的录制例如dumponexittrue其中delay、duration、maxage三种时间参数使用字母后缀表示单位s秒、m分、h时、d天maxsize使用k、M、G表示 KB、MB、GB。从参数解析实现看这些运行时选项由 JfrArgumentParser.java 负责解析JfrOptions等选项类见 JfrOptions.java负责承载构建期选项二者共同构成了 Native Image JFR 的配置体系。配置 JFR 系统日志FlightRecorderLoggingJFR 自身的日志输出通过独立的-XX:FlightRecorderLogging标志配置用法如下-XX:FlightRecorderLogging[tag1[tag2...][*][level][,...]]常见示例-XX:FlightRecorderLoggingjfrsystemdebug -XX:FlightRecorderLoggingalltrace -XX:FlightRecorderLoggingjfr*error日志配置的规则如下与仓库中 FlightRecorderLoggingHelp.txt 的记录一致未设置该选项时日志级别默认为WARNING设置为空字符串时日志级别为INFO设置为disable时日志完全关闭其余情况选项接受逗号分隔的标签组合列表每个组合可带可选通配符*和级别不带级别的标签组合默认级别为INFO消息标签匹配某组合时按该组合的级别记录组合不带通配符时仅精确匹配相同标签的消息否则匹配标签为该组合子集的消息多条组合同时匹配时最右侧的组合生效没有任何组合匹配的消息按默认级别WARNING记录选项大小写不敏感。可用日志级别trace, debug, info, warning, error, off。可用日志标签all, jfr, system, event, setting, bytecode, parser, metadata, dcmd。日志配置的解析逻辑实现于 JfrLogConfiguration.java该文件位于substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/logging/目录下与logging/子包中的相关类共同支撑 JFR 系统日志的解析与输出。功能与限制概览本节概述 Native Image 中可用的 JFR 功能及其平台限制。一个总览性事实是在 Windows 上Native Image 支持将本地 JFR 录制写入.jfr文件但远程 JMX 访问FlightRecorderMXBean以及通过jcmd控制 JFR 在 Windows 上暂不可用。另外基于信号处理器的执行采样器-H:SignalHandlerBasedExecutionSampler依赖 POSIX 的SIGPROF信号因此 Windows 上不可用Windows 使用默认的周期性回调采样器recurring-callback sampler进行 JFR 方法剖析。从源码结构看这一平台差异与 JfrOptions.java 中的SignalHandlerBasedExecutionSampler选项及其validateSamplerOption校验逻辑对应——该选项在不受支持的平台上会直接拒绝启用。采样器的具体实现位于 sampler 目录其中JfrRecurringCallbackExecutionSampler与信号处理器采样器分别对应不同的采样路径JfrNoExecutionSampler则对应采样不可用时的兜底实现。方法剖析与栈跟踪JFR 的方法剖析支持两类采样safepoint 采样与异步采样。异步采样默认开启safepoint 采样仅在需要时使用。异步采样的优势在于避免safepoint bias安全点偏差——如果剖析器只能在 safepoint 处采样就无法以相同概率采样到应用程序的所有执行点从而在剖析结果中引入偏差。两种采样器都会按指定频率周期性地产生jdk.ExecutionSample事件这些样本可以在 JDK Mission Control 或 VisualVM 等工具中查看。此外HotSpot 上支持栈跟踪的其他 JFR 事件在 Native Image 中同样支持栈跟踪。这意味着你可以做很多有意思的事情例如查看jdk.ObjectAllocationInNewTLAB的火焰图来诊断对象分配频繁发生的位置。JFR 事件流Event StreamingJFR Event Streaming 在 Native Image 中可用。事件流允许在应用层为特定事件注册回调从而对录制的管理获得更大的灵活性与控制力。例如你可以动态提高某个事件的时间阈值duration threshold只要它在事件流中出现的次数超过某个数值。事件流还能让应用获得连续的周期性 JFR 更新非常适合监控场景。当前限制流式事件上暂不提供栈跟踪——你无法在事件回调方法内访问事件的栈跟踪但这不影响.jfr快照文件中的栈跟踪快照内的栈跟踪照常工作。通过远程 JMX 与 FlightRecorderMXBean 交互你可以通过到FlightRecorderMXBean的远程 JMX 连接从进程外部与 Native Image 的 JFR 交互例如使用 JDK Mission Control 或 VisualVM 等工具。通过 JMX 可以调用FlightRecorderMXBeanAPI 来启动、停止和转储JFR 录制。注意远程 JMX 连接支持需要在构建期单独开启且属于实验性功能。相关完整流程可参考 Build and Run Native Executables with Remote JMX 指南。FlightRecorderOptions高级用户可以通过运行期选项-XX:FlightRecorderOptions微调 JFR 参数。该选项主要面向进阶场景大多数用户使用默认参数即可满足需求。泄漏剖析Leak Profiling基于jdk.OldObjectSample事件实现的泄漏剖析部分可用旧对象跟踪old object tracking是可行的但到 GC root 的路径信息不可用。使用 jcmd 控制 JFRJFR 可以通过 Java 诊断命令工具jcmd进行控制。要在原生可执行文件中启用该能力需要在构建期配置jcmd支持即--enable-monitoringjcmd。可用的 JFR 相关命令包括JFR.start、JFR.stop、JFR.check和JFR.dump。关于jcmd与 Native Image 的完整说明见 Java Diagnostic Command (jcmd) with Native Image。其中特别值得注意的组合用法是同时启用多个监控功能可以解锁更多诊断命令例如native-image --enable-monitoringjcmd,jfr,heapdump YourApplication运行时先用jcmd pid help列出可用命令其中就包含JFR.start、JFR.stop、JFR.check、JFR.dump若同时启用了jvmstat监控还可通过jcmd -l发现正在运行的本地原生进程。内置事件Native Image 提供了大量 VM 级内置事件。HotSpot JVM 上通过字节码插桩实现的 Java 级事件在 Native Image 中暂不可用这类事件包括文件 I/O 和异常类内置事件。下表列出了 Native Image 可以采集的 JFR 事件。其中部分事件仅在使用 Serial GCNative Image 的默认垃圾回收器时可用另有部分事件依赖 Native Memory TrackingNMT支持Event Namejdk.ActiveRecordingjdk.ActiveSettingjdk.AllocationRequiringGC1)jdk.ClassLoadingStatisticsjdk.ContainerCPUThrottlingjdk.ContainerCPUUsagejdk.ContainerConfigurationjdk.ContainerIOUsagejdk.ContainerMemoryUsagejdk.DataLossjdk.ExecutionSamplejdk.ExecuteVMOperationjdk.GarbageCollection1)jdk.GCHeapSummary1)jdk.GCPhasePause1)jdk.GCPhasePauseLevel11)jdk.GCPhasePauseLevel21)jdk.GCPhasePauseLevel31)jdk.GCPhasePauseLevel41)jdk.InitialEnvironmentVariablejdk.InitialSystemPropertyjdk.JavaMonitorEnterjdk.JavaMonitorInflatejdk.JavaMonitorWaitjdk.JavaThreadStatisticsjdk.JVMInformationjdk.NativeMemoryUsage3)jdk.NativeMemoryUsageTotal3)jdk.NativeMemoryUsagePeak3)jdk.NativeMemoryUsageTotalPeak3)jdk.ObjectAllocationSample1)jdk.ObjectAllocationInNewTLAB1)jdk.OldObjectSample2)jdk.OSInformationjdk.PhysicalMemoryjdk.SafepointBeginjdk.SafepointEndjdk.SocketReadjdk.SocketWritejdk.SystemGC1)jdk.ThreadAllocationStatisticsjdk.ThreadCPULoadjdk.ThreadEndjdk.ThreadParkjdk.ThreadSleepjdk.ThreadStartjdk.VirtualThreadEndjdk.VirtualThreadPinnedjdk.VirtualThreadStart使用 Serial GC 时可用。Serial GC 是 Native Image 的默认垃圾回收器相关说明见 MemoryManagement.md。使用 Serial GC 时部分可用即上文泄漏剖析一节所述支持旧对象跟踪但不含到 GC root 的路径。使用 Native Memory TrackingNMT时可用NMT 需在构建期通过--enable-monitoringnmt开启详见 NMT.md。从源码结构看上述事件的具体实现分布在 events 目录 下例如ExecutionSampleEvent.java对应方法剖析采样事件SafepointBeginEvent.java/SafepointEndEvent.java对应安全点事件AllocationRequiringGCEvent.java与JfrAllocationEvents.java对应对象分配类事件OldObjectSampleEvent.java对应泄漏剖析事件NativeMemoryUsagePeakEvent.java等则对应 NMT 相关事件。它们与 JfrJavaEvents.java 一起组成了 Native Image JFR 的事件注册体系。进一步阅读Build and Run Native Executables with JFR包含完整可运行的示例工程从javac编译、native-image构建到运行录制与查看结果的全流程。Use remote JMX with Native Image远程 JMX 连接FlightRecorderMXBean的实践指南。Java Diagnostic Command (jcmd) with Native Imagejcmd支持、可用诊断命令表与性能影响说明。相关源码JFR 运行时实现位于 substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/采样器实现位于其 sampler 子目录运行期选项的帮助文本见 StartFlightRecordingHelp.txt 与 FlightRecorderLoggingHelp.txt。【免费下载链接】graalGraalVM compiles applications into native executables that start instantly, scale fast, and use fewer compute resources 项目地址: https://gitcode.com/gh_mirrors/gr/graal创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门