2

在启用跟踪所有异常的情况下执行“飞行记录”时,我发现 JMC 存在不愉快的行为。

录制到面板后:

  • 代码 -> 异常
  • 事件->直方图->“事件类型”作为“Java应用程序/Java异常”和“分组依据”作为“类”

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

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

问候

4

1 回答 1

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 派生的所有创建的异常发出

2) jdk.JavaExceptionThrow 将针对从 java.lang.Throwable 派生的所有创建的异常发出。

为了保持低开销,默认情况下仅启用错误事件 (jdk.JavaErrorThrow),例如,如果您使用 -XX:StartFlightRecording MyProgram 启动应用程序

如果在 JMC 中选择“全部”,则禁用“jdk.JavaErrorThrow”事件(以避免重复计数)并启用“jdk.JavaExceptionThrow”。

于 2017-05-26T16:20:58.357 回答