Java JFR 如何只记录指定方法的执行事件
线上某个订单方法偶尔变慢时,不必先把整个应用交给重量级探针。对支持目标事件的 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 没有这两个事件。按这三个方向依次排查,比盲目加大采集范围更稳妥。
LiblibAI的LoRA都能直接下载吗?先看作者权限、版本文件和使用方式
- 上一篇
- LiblibAI的LoRA都能直接下载吗?先看作者权限、版本文件和使用方式
- 下一篇
- Go 请求设置 Context 超时后为什么连接还没马上消失
-
- 文章 · java教程 | 8小时前 |
- Java Pattern quoteReplacement 怎样处理字面量替换文本
- 191浏览 收藏
-
- 文章 · java教程 | 8小时前 | Java教程 · java DateTimeFormatter java.time.chrono Chronology 日本历 非ISO日历
- Java Time Chronology 非 ISO 日历的格式化
- 117浏览 收藏
-
- 文章 · java教程 | 9小时前 |
- Java CharsetDecoder 怎样处理不完整多字节输入
- 398浏览 收藏
-
- 文章 · java教程 | 9小时前 | 垃圾回收 · Java教程 · java Xmx ZGC SoftMaxHeapSize ZUncommit AlwaysPreTouch
- Java ZGC 堆容量参数的延迟目标取舍
- 380浏览 收藏
-
- 文章 · java教程 | 9小时前 |
- Java Matcher usePattern 切换模式后怎样继续扫描
- 500浏览 收藏
-
- 文章 · java教程 | 9小时前 |
- Java FFM FunctionDescriptor 映射 C 结构体参数的布局方法
- 437浏览 收藏
-
- 文章 · java教程 | 9小时前 |
- Java sealed class 与反射检查的类型边界
- 164浏览 收藏
-
- 文章 · java教程 | 9小时前 | 网络编程 · Java教程 · java httpclient 连接复用 多路复用 http/2
- Java HttpClient HTTP2 连接复用的配置方法
- 294浏览 收藏
-
- 文章 · java教程 | 9小时前 | Java教程 · 语言特性 · java 模式匹配 嵌套字段 record record pattern
- Java record 模式匹配的嵌套字段提取
- 475浏览 收藏
-
- 文章 · java教程 | 9小时前 | 反射 · 标准库 · 缓存 · Java教程 · java get remove ClassValue computeValue 类级缓存
- Java ClassValue 怎样缓存与类关联的计算结果
- 100浏览 收藏
-
- 文章 · java教程 | 9小时前 |
- Java virtual thread 阻塞调用的线程池迁移
- 141浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 761次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 757次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 841次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 807次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 638次使用
-
- Go runtime/metrics.Read 如何批量读取运行时指标:样本缓冲、描述符与类型校验
- 2026-08-28 417浏览
-
- 为延迟尖峰配置低开销 flight recorder
- 2026-10-09 493浏览
-
- Go pprof 怎样从内存剖析定位保留对象
- 2026-10-14 257浏览
-
- Go net/http/pprof 怎样暴露 goroutineleak 诊断入口
- 2026-10-24 318浏览
-
- Go trace.FlightRecorder 怎么抓短时性能现场:缓冲区、快照导出与分析边界
- 2026-08-26 240浏览

