【问题标题】:Java Mission Control says "few profiling samples", why, and what are my other options?Java Mission Control 说“很少有分析样本”,为什么,我的其他选择是什么?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 是的,我想到了,但还没有机会玩设置线程
【解决方案2】:

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

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

【讨论】:

  • 谢谢。你是对的,当我有更多的线程而不是内核时,诊断肯定会更糟。但即使我将线程设置为比内核少一点,我似乎仍然无法很好地了解时间花在了哪里。我希望下周能再次了解这一点,如果能对发生的事情有一个明确的答案,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2014-06-28
  • 2016-04-27
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多