如何在Java Mission Control中分析引发的异常?

时间:2017-05-19 14:59:07

标签: java exception profiling jmc jfr

在执行" Flight Recording"时,我发现了与JMC的 unpleasure 行为。跟踪所有启用的例外情况。

录制到面板后:

  • 代码 - >例外
  • 活动 - >直方图 - > "事件类型" as" Java Application / Java Exception"和" Group By" as" Class"

列出所有抛出的异常,但所有已创建的异常(作为对象)。

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

此致

1 个答案:

答案 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”。