如何分析生成的异常数,按异常类或代码行分类

How to profile the number of exceptions generated, categorized by exception class or line of code

提问人:Andrew Parks 提问时间:2/10/2020 最后编辑:Andrew Parks 更新时间:2/10/2020 访问量:877

问:

我正在使用许多开源的第三方库,飞行记录显示代码每秒生成数以万计的异常。

如何跟踪抛出的异常类型,以及抛出的异常在源代码中的哪个位置,以便查看是否可以自己修复第三方代码?

据我所知,Java Mission Control 没有显示任何异常类型或来源的细分。

请不要推荐昂贵的商业分析器,因为这是针对开源项目的。

Java 异常 分析 JMC JFR

评论


答:

2赞 Ingo Kegel 2/10/2020 #1

请不要推荐昂贵的商业分析器,因为这是针对开源项目的。

一些商业分析器为开源项目提供免费许可证,例如 JProfiler

在 JProfiler 中,有一个探测器显示按异常类分组的异常,并回溯到抛出它们的调用堆栈。

enter image description here

免责声明:我公司开发了 JProfiler。

评论

0赞 Klara 2/11/2020
请注意,从 Java 11 开始,JFR 不再是一个商业特性:)
0赞 Hirt 2/11/2020
另外,请注意,从 JMC 7 开始,JMC 作为 OpenJDK 的一部分开源。从 JMC 8 开始,JMC 的源代码可在 GitHub 上找到:github.com/openjdk/jmc
0赞 Ingo Kegel 2/11/2020
是的,没错,我的评论是关于 JProfiler,它是一个商业分析器。顺便说一句,从 11.1 开始,JProfiler 可以打开 JFR 快照。
6赞 Alexey Ragozin 2/10/2020 #2

据我所知,Java Mission Control 没有显示任何异常类型或来源的细分。

这是不正确的,Java Mission Control 确实提供了该信息。

首先,您需要在 Flight Recorder 中启用异常跟踪(默认情况下仅跟踪 java.lang.Error 后代)。

请参阅下面的飞行记录器设置屏幕截图。

Flight Recorder options

记录器后,您需要转到“异常”报告。

在那里,您可以找到按类划分的异常细分。 “堆栈跟踪”视图将允许获得确切的堆栈跟踪。

Mission Control

我小小的JMC现场黑客:在“堆栈跟踪”视图上引入上下文菜单,然后选择“区分帧”>“行号”(见上面的屏幕截图)。这将允许您查看行号。

如果您更喜欢 CLI 工具,请查看 SJK(免责声明,这是我自己的 OSS 分析器)。例如,下面的命令将产生来自 JFR 转储的异常的 SVG 火焰图。还有一些其他报告类型。

java -jar sjk.jar ssa -f dump.jfr --jfr-event THROW --flame > throw_flame.svg

评论

0赞 Andrew Parks 2/11/2020
谢谢,很好的答案。我正在使用命令行集合,看起来我需要设置jdk。JavaExceptionThrow 选项设置为 true。
2赞 Klara 2/11/2020
请注意命令行用法,您需要为 JFR 创建一个新的设置文件,类似于 JDK 中包含的文件(默认和配置文件)。您可以使用 JMC 执行此操作并导出文件,也可以复制 JDK/lib/jfr/profile.jfc 并更改 jdk。JavaExceptionThrow#enabled 设置为 true。然后运行您的应用程序-XX:StartFlightRecording=settings=<path to the new file>......