如何分析 Java 任务控制中抛出的异常?

How to profile thown exception in Java Mission Control?

我在启用跟踪所有异常的情况下执行 "Flight Recording" 时发现 JMC 的 不愉快 行为。

录制到面板后:

列出了不是所有抛出的异常,而是所有创建的异常(作为对象)。

有没有一种方法(或插件)可以在分析过程中生成抛出的异常列表?

此致

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"。