【发布时间】:2018-03-05 20:41:18
【问题描述】:
我正在使用 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。
【问题讨论】:
-
要查看行号:单击堆栈跟踪视图右上角的白色倒三角形图标,选择“Distinguish Frames By”,然后选择“Line Number”
-
实际上,您应该有更多的样本,因为同时对多个线程进行了采样。
-
仅供参考:JVisualVM 可单独下载visualvm.github.io
-
由于我在 Java Mission Control 团队工作,我对改进自动化分析非常感兴趣。如果结果与您对应用程序的理解不符,我会很高兴查看这个特定的 JFR 文件。如果您愿意,请在 twitter (@klaraward) 上关注我,我们可以进一步讨论。
-
谢谢@klara,我会在推特上私信你。这个最新的跟踪实际上确实在 GC 上花费了额外的时间,看起来每 10 秒运行时大约有 2 秒的暂停。但是,我仍然期待更多的样品!而且,通过 hprof,我会得到一些样本,显示哪个行号导致了触发 GC 的分配,所以这很有用。
标签: java performance profiling hprof java-mission-control