jfr不记录异常抛出时的局部变量值,但可高效捕获exceptionthrown事件并关联栈、类型、时间等上下文,结合配置与分析可定位高频异常路径;需显式启用exception-thrown=true,推荐profile预设以降低开销;通过jmc分析stacktrace、exception、message等字段识别热点与根因;辅以结构化日志、条件断点和防御性打点补全变量信息;注意过滤被吞异常,避免误判。

Java Flight Recorder(JFR)本身不直接记录“异常抛出时的局部变量值”,但它能高效捕获异常事件(如 ExceptionThrown),并关联线程栈、方法调用路径、时间戳、异常类型等关键上下文。结合合理配置与后续分析,可定位异常高频发生的热点路径,间接揭示哪些变量组合或状态最可能触发异常。
启用异常事件录制(最小开销)
JFR 默认不开启异常事件,需显式启用。生产环境推荐使用低开销配置:
- 添加 JVM 启动参数:
-XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=/tmp/exceptions.jfr,settings=profile,exception-thrown=true - 其中
exception-thrown=true启用jdk.ExceptionThrown事件;settings=profile使用轻量级预设(比default开销更低) - 若需长期滚动录制,可用:
-XX:StartFlightRecording=delay=60s,duration=300s,settings=profile,exception-thrown=true,filename=/tmp/exceptions_%t.jfr
关注核心事件字段:不只是“哪里抛了”,更要“为什么常抛”
在 JMC(Java Mission Control)或 jfr 命令行工具中打开录制文件后,筛选 jdk.ExceptionThrown 事件,重点关注以下字段:
-
stackTrace:完整调用栈——识别高频重复的栈顶方法(如
UserService.processOrder()),即“热点路径” -
exception:异常类名(如
NullPointerException、IllegalArgumentException)——按类型聚合,判断是空指针、参数校验失败还是资源竞争 -
message:异常消息内容(若存在)——例如
"id cannot be null"可直接指向问题变量 - startTime 和 duration:观察异常是否集中在某段时间(如定时任务执行后、流量突增时)
补全变量上下文:JFR + 日志 + 条件断点协同分析
JFR 不记录局部变量,但可通过以下方式低成本补全关键变量信息:
- 在热点路径的异常抛出处(如 catch 块或 throws 前)添加结构化日志,仅在异常发生时输出相关变量:
log.warn("NPE in processOrder, userId={}, orderId={}, status={}", user.getId(), order.getId(), order.getStatus()); - 对高频异常方法,在开发/预发环境用 IDE 设置条件断点(如
exception instanceof NullPointerException),手动检查变量值,验证假设 - 若已知某变量易为空,可在代码中提前防御性打点:
if (user == null) { log.debug("user is null at call site: {}", Thread.currentThread().getStackTrace()[1]); }
避免误判:区分“抛出”与“捕获”,聚焦未处理异常
JFR 的 ExceptionThrown 记录所有 throw,包括被 try-catch 吞掉的异常。生产中大量吞异常(尤其 catch(Exception e){})会污染分析结果:
- 优先筛选
stackTrace中不含常见日志框架或通用异常处理器(如org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver)的事件 - 配合 GC 日志、线程状态(JFR 中的
jdk.ThreadPark或jdk.JavaThreadStatistics)交叉判断:若异常激增同时伴随线程阻塞或 GC 频繁,可能指向资源耗尽类根本原因 - 对已知“合法”的受检异常(如
IOException在文件读取中),可在 JFR 过滤器中排除,聚焦运行时异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











