我正在使用Java Mission Control对Java应用程序进行分析,并且在飞行记录的主页上说:"即使CPU负载很高,此录制也包含很少的分析样本。因此,分析数据可能无关。"
这似乎是在说实话。我要求每10毫秒每10毫秒采样3分钟,应该是18000个样本,但我只看到996个样本。
它继续解释:"因此分析数据可能无关紧要。这可能是因为该应用程序运行了很多JNI代码,或者JVM在GC,类加载,JIT编译等上花费了很多时间。"
嗯,我没有任何本机方法,它不应该在我录制的舞台上加载类或进行任何JIT(众所周知的重复数字crunching crunch crunch crunch of code。)看起来不像它花费过多的时间垃圾收集。
我们曾经使用HPROF来介绍该产品,并取得了很大的成功。HPROF极大地帮助弄清了我们依赖主线程执行的位置,因此我们可以将热点并联成多个线程。但是该工具在Java 9中停产了,因此我们继续前往Java任务控制。它有很多事情要做,但是如果它无法识别VM线程在随机示例时间上坐在哪个行号,那不是很有用。还有其他一些工具可以使用吗?或者,有没有办法可以从Java任务控制中进行进一步调试?看起来JVisualVM不再包含在Java 9中。
如果您的运行线程比内核更多,则采样线程可能会饿死,并且无法在指定的间隔下醒来。
答案可能就像您比内核更简单,因此大多数在采样时没有在CPU上安排它们。JFR方法采样器只能将螺纹样本实际上保留在CPU上。这个想法是为您提供您实际上在执行Java代码的时间实际花费时间的视图。
现在,我们知道在某些情况下,您要获取所有线程的随机样本,无论它们在做什么。我们正在JDK 10中添加新的分析功能/事件。