在执行" Flight Recording"时,我发现了与JMC的 unpleasure 行为。跟踪所有启用的例外情况。
录制到面板后:
列出不所有抛出的异常,但所有已创建的异常(作为对象)。
在分析过程中,有一种方式(或插件)可以生成抛出的异常列表吗?
此致
答案 0 :(得分:1)
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派生的所有异常 created 发出
2)jdk.JavaExceptionThrow将为从java.lang.Throwable派生的所有 created 异常发出。
为了保持开销较低,默认情况下启用错误事件(jdk.JavaErrorThrow),例如,如果使用-XX启动应用程序:StartFlightRecording MyProgram
如果在JMC中选择“全部”,则禁用“jdk.JavaErrorThrow”事件(以避免重复计数)并启用“jdk.JavaExceptionThrow”。