【问题标题】:How to profile thown exception in Java Mission Control?如何在 Java Mission Control 中分析异常?
【发布时间】:2017-05-19 14:59:07
【问题描述】:

我发现 JMC 在执行“飞行记录”并启用跟踪所有异常时的一个不愉快行为。

录制到面板后:

  • 代码 -> 例外情况
  • 事件 -> 直方图 -> “事件类型”为“Java 应用程序/Java 异常”,“分组依据”为“类”

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

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

问候

【问题讨论】:

    标签: java exception profiling jmc jfr


    【解决方案1】:

    Java Flight Recorder (JFR) 只能在创建异常时进行记录。未来的版本可能能够记录何时抛出异常,或按类类型过滤。

    这是一个显示 JDK 11 中的工作原理的 sn-p。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”。

    【讨论】:

    • 但是在哪里可以找到记录的创建异常?我正在尝试在github.com/vorburger/… 中使用它,但看不到它们...
    • 问题实际上不在于在 UI 中的何处找到它们(在 jdk.java.net/jmc 的较新版本中,它是“事件浏览器”而不是“事件 -> 直方图”),但非错误异常确实如此尽管异常级别从“错误”更改为“全部”,但似乎没有被记录。
    • 在“真实”应用程序中,具有异常级别的自定义 JFC 从“错误”更改为“全部”实际上可以工作。似乎有一些 .. 优化(?)使其无法在像我的 github.com/vorburger/… 这样的琐碎的短期测试示例中工作。
    • 我添加了一个代码 sn-p 来解释事情是如何工作的。 IOException 事件源自 java.lang.Throwable,默认情况下不启用(以保持低开销)。要使其工作,您必须在 JMC 中选择“全部”。如果您仅使用 -XX:StartFligtRecording 启动您的应用程序,您将不会收到该事件。但是,您可以使用“全部”从 JMC 导出模板文件并启动示例程序,如下所示:-XX:StartFlightRecording:settings=myconfig.jfc 它应该可以工作
    猜你喜欢
    • 2016-06-07
    • 2016-04-27
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多