【问题标题】:How to profile the number of exceptions generated, categorized by exception class or line of code如何分析生成的异常数量,按异常类或代码行分类
【发布时间】:2020-05-25 14:25:55
【问题描述】:

我正在使用一些开源第三方库,飞行记录显示代码每秒产生数万个异常。

我如何追踪引发了哪种类型的异常,以及它在源代码中被引发的位置,以便我可以查看是否可以自己修复第三方代码?

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

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

【问题讨论】:

    标签: java exception profiling jmc jfr


    【解决方案1】:

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

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

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

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

    一旦记录器你需要去“例外”报告。

    您可以在其中找到按类别划分的异常情况。 “堆栈跟踪”视图将允许获得准确的堆栈跟踪。

    I little JMC live hack:在“堆栈跟踪”视图中打开上下文菜单,然后选择“区分帧”>“行号”(参见上面的屏幕截图)。这将允许您查看行号。

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

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

    【讨论】:

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

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

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

    在 JProfiler 中,有一个探针显示按异常类分组的异常,并回溯到引发异常的调用堆栈。

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

    【讨论】:

    • 请注意,从 Java 11 开始,JFR 不再是商业功能 :)
    • 另外,请注意,自 JMC 7 起,JMC 作为 OpenJDK 的一部分开源。从 JMC 8 开始,JMC 的源代码可在 GitHub 上找到:github.com/openjdk/jmc
    • 是的,这是正确的,我的评论是关于 JProfiler,它是一个商业分析器。顺便说一句,从 11.1 开始,JProfiler 可以打开 JFR 快照。
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2012-09-05
    相关资源
    最近更新 更多