在启用跟踪所有异常的情况下执行“飞行记录”时,我发现 JMC 存在不愉快的行为。
录制到面板后:
- 代码 -> 异常
- 事件->直方图->“事件类型”作为“Java应用程序/Java异常”和“分组依据”作为“类”
列出的不是所有抛出的异常,而是所有创建的异常(作为对象)。
有一种方式(或插件)可以在分析过程中生成抛出的异常列表?
问候
Java Flight Recorder (JFR) 只能在创建异常时进行记录。未来的版本可能能够记录何时抛出异常,或按类类型过滤。
这是一个片段,展示了 JDK 11 中的工作方式。Oracle JDK 7、8、9 和 10 的工作方式类似,但事件名称不同。
try (Recording r = new Recording()) {
r.enable("jdk.JavaExceptionThrow");
r.start();
new IOException();
r.stop();
dumpAndPrint(r, "Events for exception deriving from java.lang.Throwable");
}
try (Recording r = new Recording()) {
r.enable("jdk.JavaErrorThrow");
r.start();
new InternalError();
r.stop();
dumpAndPrint(r, "Events for exception deriving from java.lang.Error");
}
}
void dumpAndPrint(Recording r, String title) throws IOException {
System.out.println(title);
Path p = Files.createTempFile("test", ".jfr");
r.dump(p);
for (RecordedEvent e : RecordingFile.readAllEvents(p)) {
System.out.println(e);
}
System.out.println();
}
有两种事件类型
1) jdk.JavaErrorThrow 将针对从 java.lang.Error 派生的所有创建的异常发出
2) jdk.JavaExceptionThrow 将针对从 java.lang.Throwable 派生的所有创建的异常发出。
为了保持低开销,默认情况下仅启用错误事件 (jdk.JavaErrorThrow),例如,如果您使用 -XX:StartFlightRecording MyProgram 启动应用程序
如果在 JMC 中选择“全部”,则禁用“jdk.JavaErrorThrow”事件(以避免重复计数)并启用“jdk.JavaExceptionThrow”。