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

Posted

技术标签:

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

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

录制到面板后:

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

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

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

问候

【问题讨论】:

【参考方案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 它应该可以工作

以上是关于如何在 Java Mission Control 中分析异常?的主要内容,如果未能解决你的问题,请参考以下文章

仍然可以使用 Java Mission Control 连接到远程 JMX 但证书已过期?

Java Mission Control - 访问被拒绝连接到远程

深入理解java虚拟机(十三)Java Mission Control:可持续在线的监控工具

Java Mission Control:飞行记录器抛出:javax.naming.ServiceUnavailableException

Java Mission Control Flight Recorder 中没有记录 CPU 使用情况

使用 Flight Recorder 和 JDK Mission Control 计算更多方法