我正在使用Java thus分析一个Java应用程序,它在飞行记录的主页上说:“即使CPU负载很高,此记录包含的分析样本也很少。因此,分析数据可能不相关。”
它似乎说的是事实。我要求它每10毫秒采样3分钟,应该是18000个样本,但我只看到了996个样本。
它继续解释说:“分析数据可能是不相关的,这可能是因为应用程序正在运行大量的JNI代码,或者JVM在GC、类加载、JIT编译等方面花费了大量时间。”
嗯,我没有任何本机方法,它不应该在我记录的阶段装入类或执行任何JIT (很好地进入代码的重复数字处理部分)。它看起来也不像是在垃圾收集上花费过多的时间。
我们过去常常使用hprof来描述这个产品,并取得了很大的成功。Hprof在找出我们在哪里依赖主线程执行方面提供了巨大的帮助,因此我们可以将热点并行到多个线程中。但该工具在Java 9中停止使用,因此我们将继续使用Java任务控制。它有很多用处,但如果它不能在随机采样时间识别VM线程所在的行数,那么它就没有多大用处。还有没有其他工具可以使用?或者,有没有一种方法可以在Java Java中进一步调试?看起来JVisualVM不再包含在Java9中。
发布于 2017-10-18 21:23:23
如果正在运行的线程比核心多得多,则采样线程可能会耗尽资源,并且无法在指定的时间间隔内唤醒。
发布于 2017-10-23 20:03:47
答案可能很简单,因为您的线程比核心多,因此在采样时,大多数线程都不在CPU上调度。JFR方法采样器将只在CPU上实际保存线程的样本。这样做的目的是为您提供一个视图,让您了解在执行Java代码时实际花费了哪些时间。
现在,我们知道,在某些情况下,您希望随机获取所有线程的样本,而不管它们在做什么。我们在JDK 10中添加了新的性能分析功能/事件。
https://stackoverflow.com/questions/46395700
复制相似问题