2

我正在使用 Java Mission Control 分析 Java 应用程序,它在飞行记录的主页上说“即使 CPU 负载很高,该记录也包含很少的分析样本。因此分析数据可能不相关。”

好像说的是实话。我要求它每 10 毫秒采样 3 分钟,这应该是 18000 个样本,但我只看到 996 个样本。

它继续解释“因此分析数据可能不相关。这可能是因为应用程序正在运行大量 JNI 代码,或者 JVM 在 GC、类加载、JIT 编译等方面花费了大量时间。”

嗯,我没有任何本机方法,它不应该在我记录的阶段加载类或执行任何 JIT(以及代码的重复数字处理部分。)它看起来不像花费过多的垃圾收集时间。

我们曾经使用 hprof 来分析这个产品,并取得了很大的成功。Hprof 极大地帮助确定了我们依赖主线程执行的位置,因此我们可以将热点并行化为多个线程。但是该工具在 Java 9 中已停止使用,因此我们将继续使用 Java Mission Control。它有很多用途,但如果它无法识别 VM 线程在随机采样时间所在的行号,它就不是很有用。还有其他工具可以使用吗?或者,有没有办法从 Java Mission Control 中进一步调试?Java 9 中似乎也不再包含 JVisualVM。

4

2 回答 2

1

答案可能很简单,因为您拥有的线程多于内核,因此在采样时它们中的大多数都没有被安排在 CPU 上。JFR 方法采样器只会在 CPU 上实际保留线程样本。这样做的目的是让您了解实际花费时间执行 Java 代码的位置。

现在,我们知道在某些情况下,您想要获取所有线程的随机样本,无论它们在做什么。我们正在 JDK 10 中添加新的分析功能/事件。

于 2017-10-23T12:03:47.430 回答
1

如果您的运行线程数多于内核数,则采样线程可能会被饿死,并且无法在您指定的时间间隔内唤醒。

于 2017-10-18T13:23:22.740 回答