我正在使用 Java 任务控制分析一个 Java 应用程序,它在飞行记录的主页上说,“尽管CPU负载很高,但此记录包含的分析样本很少。因此分析数据可能不相关。”
好像说的是实话。我要求它每10毫秒采样3分钟,这应该是18000个样本,但我只看到996个样本。
它继续解释说“因此剖析数据可能是不相关的。这可能是因为应用程序正在运行大量JNI代码,或者JVM在GC、类加载、JIT编译等方面花费了大量时间。”
嗯,我没有任何本机方法,在我记录的阶段,它不应该加载类或执行任何JIT(很好地融入到代码的重复数字处理部分)。看起来它也不会花费过多的时间来收集垃圾。
我们曾经使用hprof来描述该产品,并取得了很大的成功。Hprof极大地帮助了我们找出主线程执行的依赖点,因此我们可以将热点并行化到多个线程中。但是这个工具在Java 9中停止使用了,所以我们转向Java Mission Control。它有很多优点,但是如果它不能在随机采样时间识别VM线程所在的行号,它就没有多大用处。有其他工具可以使用吗?或者,有没有办法从Java Mission Control内部进一步调试这个问题?看起来Java 9中也不再包含JVM了。
如果您的运行线程比内核多得多,则采样线程可能会被饥饿并且无法在您指定的时间间隔内唤醒。
答案可能很简单,因为线程比内核多,因此在采样时,大多数线程都不会在CPU上调度。JFR方法采样器将只保留CPU上实际线程的样本。其目的是为您提供执行Java代码的实际时间的视图。
现在,我们知道在某些情况下,您希望获取所有线程的随机样本,无论它们在做什么。我们正在JDK 10中添加新的分析功能/事件。