Java JFR 如何只记录指定方法的执行事件
来源:17golang原创
时间:2026-09-12 11:56:28 139浏览 收藏
线上某个订单方法偶尔变慢时,不必先把整个应用交给重量级探针。对支持目标事件的 JDK,可以让 Java Flight Recorder(JFR)只关注一个类或一个方法:jdk.MethodTiming 适合看调用聚合,jdk.MethodTrace 适合看单次调用和调用栈,再用 filter 把范围收窄。
想只记录指定方法,关键不是打开jdk.ExecutionSample后再猜栈,而是启用jdk.MethodTiming或jdk.MethodTrace,并把jdk.Method*#filter写成目标类/方法;生产排查优先短窗口,追踪事件再加阈值。
- MethodTiming 看聚合计时,MethodTrace 看逐次调用和可选调用栈。
- 过滤器支持类、类方法、方法名和注解,多个目标用分号组合。
settings=none可减少无关事件;JFR 文件仍要按事件名单独读取。
先分清 MethodTiming 和 MethodTrace
这两个事件解决的是不同问题。MethodTiming 按周期整理目标方法的调用与耗时信息,适合先判断“它是不是持续变慢”;MethodTrace 更接近逐次追踪,能保留单次执行时长和调用栈,适合继续追“谁调用了它”。后者数据增长更快,所以不要一上来对整个包开启。
| 事件 | 适合的问题 | 优先配置 |
|---|---|---|
jdk.MethodTiming | 一段窗口内的调用与计时概况 | filter、period |
jdk.MethodTrace | 某次调用耗时及调用栈 | filter、threshold、stackTrace |

把过滤器收窄到类、方法或注解
JFR 的 filter 只对 MethodTrace 和 MethodTiming 这类方法事件有意义。一个精确的方法可以写成 com.example.OrderService::createOrder;写类名表示该类的方法范围;只写 ::methodName 表示按方法名匹配;也可以写注解目标。多个目标用分号连接,类名和方法名要以实际字节码中的名称为准。
如果只是想看 CPU 热点,jdk.ExecutionSample 仍然有用,但它是周期采样,不等于每次调用都产生一条方法执行事件。不要把两种结果混在一起解读。
# 只新增两个方法事件,避免 settings=none 带入默认事件集合
java -XX:StartFlightRecording=\
settings=none,\
filename=order-method.jfr,\
+jdk.MethodTiming#enabled=true,\
+jdk.MethodTiming#filter=com.example.OrderService::createOrder,\
+jdk.MethodTiming#period=1s,\
+jdk.MethodTrace#enabled=true,\
+jdk.MethodTrace#filter=com.example.OrderService::createOrder,\
+jdk.MethodTrace#threshold=20ms,\
+jdk.MethodTrace#stackTrace=true \
-jar app.jar
这里的 + 表示在空配置中加入事件设置。若要同时关注多个方法,可以把过滤器写成 com.example.OrderService::createOrder;com.example.OrderService::cancelOrder。不要用换一个同义方法名的方式扩大范围,先确认你真正要回答的是哪一个调用问题。

用一段短录制采集目标方法
应用已经运行时,用 jcmd 不必重启进程。先确认 PID,再让录制只持续一个能覆盖目标请求的窗口;例如压测只需要 30 秒,就不要让 MethodTrace 一直写盘。
# 先列出当前 JVM,确认目标进程和当前用户权限
jcmd -l
# 只采集 30 秒;把目标方法和慢调用阈值写进同一条录制配置
jcmd JFR.start name=order-method duration=30s settings=none \
+jdk.MethodTiming#enabled=true \
+jdk.MethodTiming#filter=com.example.OrderService::createOrder \
+jdk.MethodTiming#period=1s \
+jdk.MethodTrace#enabled=true \
+jdk.MethodTrace#filter=com.example.OrderService::createOrder \
+jdk.MethodTrace#threshold=20ms \
+jdk.MethodTrace#stackTrace=true \
filename=order-method.jfr
如果目标方法在 30 秒内没有被请求,文件里没有对应事件并不能证明过滤器错误;先延长窗口或制造一次合规请求。若目标 JDK 不认识 MethodTiming/MethodTrace,则应先查看本机的 jfr metadata 与 jcmd ,不能照抄另一版本的设置。
从 JFR 文件读取结果并避开误区
读取时按事件名过滤,先把其他 JFR 事件从视线中移开:
# 只打印这次方法采集的两个事件,便于对照过滤器和窗口
jfr print --events jdk.MethodTiming,jdk.MethodTrace order-method.jfr
# 需要表格化概览时,再使用 JFR 工具提供的对应视图
jfr view method-timing order-method.jfr
看到 MethodTiming 记录,说明目标方法在某个聚合周期内产生了可记录数据;看到 MethodTrace,重点看单次耗时、线程和调用栈。threshold=20ms 会让更快的 MethodTrace 调用不进入结果,因此“没有 trace”可能只是调用都低于阈值。要观察调用栈时保留 stackTrace=true;只想降低记录负担时,可以关闭它并只保留耗时。
常见问题
只想找热点,为什么不直接用 ExecutionSample?
ExecutionSample 适合低成本地看采样热点,但它不保证每次方法调用都被记录。需要精确方法事件时,使用 MethodTiming 或 MethodTrace。
一个过滤器能写多个目标吗?
可以,按官方过滤语法用分号分隔多个类、类方法、方法名或注解;先从一个目标开始,避免把追踪范围放大。
为什么命令能启动但没有方法事件?
常见原因是目标方法没有在录制窗口内执行、阈值过滤了快速调用,或当前 JDK 没有这两个事件。按这三个方向依次排查,比盲目加大采集范围更稳妥。
-
364 收藏
-
163 收藏
-
129 收藏
-
文章 · java教程 | 21小时前 | 故障排查 · Java教程 · 模块化 · ServiceLoader · SPI · 类加载器 · java SPI ServiceLoader ClassLoader module-info.java META-INF/services490 收藏
-
文章 · java教程 | 22小时前 | httpclient · Java教程 · 网络请求 · InputStream · 资源关闭 · java httpclient 流式读取 InputStream BodyHandlers.ofInputStream 大响应145 收藏
-
189 收藏
-
文章 · java教程 | 1天前 | 正则表达式 · 字符串处理 · pattern · Java教程 · 代码实践 · java Java正则表达式 Pattern.DOTALL 匹配换行 Pattern.MULTILINE199 收藏
-
175 收藏
-
298 收藏
-
350 收藏
-
452 收藏
-
文章 · java教程 | 1天前 | 异常处理 · 并发编程 · api设计 · Java教程 · CompletableFuture · java 异常处理 异步编程 completablefuture Handle 统一结果338 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习