Spring Boot高负载后JMC无法查看JFR中8000+异常详情求助
如何读取JFR中隐藏的异常详情
1. 用jfr print命令导出完整异常数据
这是绕过JMC UI限制最直接的方式,能直接提取所有异常事件的细节:
- 导出所有异常事件到文本文件:
jfr print --events Exception your-recording.jfr > exception-details.txt - 过滤被底层捕获的异常(对应你说的应用层无感知的情况):
jfr print --events Exception --fields message,stackTrace,type,thread your-recording.jfr | grep -A 20 "uncaught=false"
输出内容会包含异常类型、错误消息、完整堆栈跟踪和触发线程,直接定位底层抛出的异常。
2. 调整JMC显示配置
JMC默认可能限制显示行数或隐藏关键字段,试试这些操作:
- 打开Event Browser,找到
jdk.Exception事件,右键选择View Event Data,在弹窗中调整显示行数上限,同时勾选stackTrace、message等字段。 - 检查JMC偏好设置中的JFR过滤规则,确保没有屏蔽异常事件的细节信息。
3. 编程解析JFR文件
如果命令行和JMC都无法满足需求,用Java代码直接读取JFR文件:
import jdk.jfr.consumer.RecordedEvent; import jdk.jfr.consumer.RecordingFile; import java.nio.file.Paths; public class JfrExceptionParser { public static void main(String[] args) throws Exception { try (RecordingFile rf = new RecordingFile(Paths.get(args[0]))) { while (rf.hasMoreEvents()) { RecordedEvent event = rf.readEvent(); if ("jdk.Exception".equals(event.getEventType().getName())) { System.out.printf("异常类型: %s%n", event.getValue("type")); System.out.printf("异常消息: %s%n", event.getValue("message")); System.out.printf("堆栈跟踪: %s%n", event.getValue("stackTrace")); System.out.printf("是否未捕获: %b%n", event.getValue("uncaught")); System.out.println("----------------------------------------"); } } } } }
编译运行时传入JFR文件路径,即可输出所有异常的完整信息。
4. 优化后续JFR录制配置
如果是录制时未捕获堆栈导致的无详情,下次录制时确保开启完整堆栈:
- 命令行录制:
jfr start --settings profile --stack-depth=256 --name=HighLoadRecording - Spring Boot配置文件中添加:
jdk.jfr.configuration=profile jdk.jfr.stack-depth=256
内容的提问来源于stack exchange,提问作者Altug
相关产品推荐
相关产品推荐

