Java Flight Recorder 中是否计算 JVM 生命周期的异常?

Are exceptions counted for JVM lifetime in Java Flight Recorder?

我有 运行 Java 飞行记录器在 JBoss EAP 6.1 应用程序服务器上记录了 2 分钟的负载。我启用了异常计数(Java Application => Java Exception => Enabled=true),我对报告的异常数量感到惊讶。

当我查看事件类型为 "Java Application/ Java Exception" 并按 "Event Thread" 分组的事件 => 直方图视图时,10 个线程每个都有超过 2000 个异常。其中 3 个有超过 3000 个异常。

这是报告的 Throwable 或 Error 创建总数:

Stack Trace                          Sample Count
java.lang.Throwable.<init>()              128 059
java.lang.Throwable.<init>(String)        116 107
java.lang.Throwable.<init>(Throwable)      39 207
java.lang.Error.<init>()                        7
java.lang.Throwable.<init>(String, Throwable)   2

所以我想知道所有这些异常是在我记录的 2 分钟内发生的,还是从 JVM 启动后计算的?

“直方图”选项卡中的

"Sample Count" 列汇总了关于字段值的 事件数量 ,在您的情况下,我相信堆栈跟踪的顶部框架。所以数字 128 059 表示在您的录制过程中发出了很多事件,顶帧为“java.lang.Throwable.<init>()”。

这可能不是您要查找的信息。

我建议使用记录模板启用异常/错误,并查看“异常”选项卡,而不是编辑单个事件的设置并使用“直方图”选项卡。

TL;DR: Java 异常事件只计算记录期间发生的事情。 JVM 生命周期(或其他 'JVM global' 时间)期间的异常统计事件计数异常。

有两个不同的数据点,Java Exception 和 Java Error 事件,以及 Statistics/Throwables 事件。 如果你只看Java Exception/Error,你在录音中的事件就是那段时间发生的事件。 Statistics/Throwables 事件以固定的时间间隔获取,可能从 JVM 启动开始,或者可能从 JFR 引擎启动,或者从 运行 中发生的第一个 JFR 记录开始虚拟机。比较这些值相对于彼此最有趣。此事件显示在 Code/Exceptions 选项卡顶部的两个文本字段中。

另请注意,Exception/Error 事件发生在构造函数中,而不是在实际抛出时发生

如果您的程序创建了很多 Java 错误事件,则这些事件的双重记账会有些麻烦,因此数字可能不正确(我们已在下一个 JMC 版本中对此进行了补偿,但在 JMC 5.5 中没有) 其他 Throwable 子类将显示为异常事件。