如何在 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