如何分析 Java 任务控制中抛出的异常?
How to profile thown exception in Java Mission Control?
我在启用跟踪所有异常的情况下执行 "Flight Recording" 时发现 JMC 的 不愉快 行为。
录制到面板后:
- 代码 -> 异常
- 事件 -> 直方图 -> "Event type" 作为 "Java Application/Java Exception" 和 "Group By" 作为 "Class"
列出了不是所有抛出的异常,而是所有创建的异常(作为对象)。
有没有一种方法(或插件)可以在分析过程中生成抛出的异常列表?
此致
Java飞行记录器(JFR)只能在创建异常时记录。未来的版本可能会在抛出异常时进行记录,或者根据 class 类型进行过滤。
这是一个片段,展示了 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 中 select "All","jdk.JavaErrorThrow" 事件将被禁用(以避免重复计数)并启用 "jdk.JavaExceptionThrow"。
我在启用跟踪所有异常的情况下执行 "Flight Recording" 时发现 JMC 的 不愉快 行为。
录制到面板后:
- 代码 -> 异常
- 事件 -> 直方图 -> "Event type" 作为 "Java Application/Java Exception" 和 "Group By" 作为 "Class"
列出了不是所有抛出的异常,而是所有创建的异常(作为对象)。
有没有一种方法(或插件)可以在分析过程中生成抛出的异常列表?
此致
Java飞行记录器(JFR)只能在创建异常时记录。未来的版本可能会在抛出异常时进行记录,或者根据 class 类型进行过滤。
这是一个片段,展示了 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 中 select "All","jdk.JavaErrorThrow" 事件将被禁用(以避免重复计数)并启用 "jdk.JavaExceptionThrow"。