当前位置:首页 > 文章列表 > 文章 > java教程 > Java JFR 如何只记录指定方法的执行事件

Java JFR 如何只记录指定方法的执行事件

来源:17golang原创 2026-09-12 11:56:28 0浏览 收藏

线上某个订单方法偶尔变慢时,不必先把整个应用交给重量级探针。对支持目标事件的 JDK,可以让 Java Flight Recorder(JFR)只关注一个类或一个方法:jdk.MethodTiming 适合看调用聚合,jdk.MethodTrace 适合看单次调用和调用栈,再用 filter 把范围收窄。

想只记录指定方法,关键不是打开 jdk.ExecutionSample 后再猜栈,而是启用 jdk.MethodTimingjdk.MethodTrace,并把 jdk.Method*#filter 写成目标类/方法;生产排查优先短窗口,追踪事件再加阈值。
要点速览
  • MethodTiming 看聚合计时,MethodTrace 看逐次调用和可选调用栈。
  • 过滤器支持类、类方法、方法名和注解,多个目标用分号组合。
  • settings=none 可减少无关事件;JFR 文件仍要按事件名单独读取。

先分清 MethodTiming 和 MethodTrace

这两个事件解决的是不同问题。MethodTiming 按周期整理目标方法的调用与耗时信息,适合先判断“它是不是持续变慢”;MethodTrace 更接近逐次追踪,能保留单次执行时长和调用栈,适合继续追“谁调用了它”。后者数据增长更快,所以不要一上来对整个包开启。

事件适合的问题优先配置
jdk.MethodTiming一段窗口内的调用与计时概况filterperiod
jdk.MethodTrace某次调用耗时及调用栈filterthresholdstackTrace
Java JFR MethodTiming 与 MethodTrace 的静态事件关系图,展示 Recording、过滤器、目标方法和 JFR 文件边界
图1:Java JFR 方法事件职责边界示意图;展示 MethodTiming 与 MethodTrace 的静态关系。

把过滤器收窄到类、方法或注解

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。不要用换一个同义方法名的方式扩大范围,先确认你真正要回答的是哪一个调用问题。

Java JFR filter 从类、方法和注解收窄到 MethodTiming 与 MethodTrace 的静态边界关系
图2:过滤器范围示意图;类、类方法、方法名和注解是可组合的静态目标,图中没有模拟终端或运行结果。

用一段短录制采集目标方法

应用已经运行时,用 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 metadatajcmd help JFR.start,不能照抄另一版本的设置。

从 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 没有这两个事件。按这三个方向依次排查,比盲目加大采集范围更稳妥。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
LiblibAI的LoRA都能直接下载吗?先看作者权限、版本文件和使用方式LiblibAI的LoRA都能直接下载吗?先看作者权限、版本文件和使用方式
上一篇
LiblibAI的LoRA都能直接下载吗?先看作者权限、版本文件和使用方式
Go 请求设置 Context 超时后为什么连接还没马上消失
下一篇
Go 请求设置 Context 超时后为什么连接还没马上消失
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    98次使用
  • OpenCompass大模型评测体系详解:功能、使用指南与应用场景
    OpenCompass
    OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
    28次使用
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    253次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    180次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    115次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码