0

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

当我查看事件类型为“Java 应用程序/Java 异常”并按“事件线程”分组的事件 => 直方图视图时,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 启动开始计算的?

4

2 回答 2

1

直方图选项卡中的“样本计数”列聚合了与字段值相关的事件数,在您的情况下,我相信堆栈跟踪的顶部框架。因此,数字 128 059 意味着java.lang.Throwable.<init>()在您的录制过程中发出了许多带有顶部帧“”的事件。

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

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

于 2016-04-09T07:19:49.353 回答
0

TL;DR:Java 异常事件仅计算录制期间发生的情况。JVM 生命周期(或其他一些“JVM 全局”时间)期间的异常统计事件计数异常。

有两个不同的数据点,Java Exception 和 Java Error 事件,以及 Statistics/Throwables 事件。如果您只查看 Java Exception/Error,那么您在记录中的事件就是在那段时间发生的事件。Statistics/Throwables 事件以固定间隔进行,可能从 JVM 启动开始,或者可能从 JFR 引擎启动开始,或者从正在运行的 JVM 中发生的第一个 JFR 记录开始。将这些值相互比较是最有趣的。此事件显示在代码/异常选项卡顶部的两个文本字段中。

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

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

于 2016-04-11T09:25:33.687 回答