我一直在使用 Yourkit 8.0 来分析在 Mac OS X(10.5.7,Apple JDK 1.6.0_06-b06-57)下运行的数学密集型应用程序,并注意到 CPU 分析结果中有一些奇怪的行为。
例如 - 我使用采样进行了一次性能分析,结果显示应用程序 10 分钟运行时间的 40% 花在了 StrictMath.atan 方法上。我觉得这很费解,但我接受了它的说法,并花了一些时间用极其简单的多项式拟合替换 atan。
当我再次运行该应用程序时,它花费的时间几乎与之前完全相同(10 分钟)- 但我的 atan 替代品在分析结果中没有任何显示。相反,其他主要热点的运行时间百分比只是增加以弥补它。
总结:
StrictMath.atan 的结果(本地方法)
总运行时间:10 分钟
方法一:20%
方法二:20%
方法三:20%
StrictMath.atan:40%
使用简化、纯 Java atan 的结果
总运行时间:10 分钟
方法一:33%
方法二:33%
方法三:33%
(方法 1、2、3 不执行任何 atan 调用)
知道这种行为是怎么回事吗?我使用 EJ-Technologies 的 JProfiler 得到了相同的结果。似乎 JDK 分析 API 报告的 native 方法结果不准确,至少在 OS X 下是这样。
最佳答案
发生这种情况的原因可能是采样时间不一致。因此,例如,如果一个方法使用了相当多的时间,但执行时间不长,则采样可能会错过它。另外,我认为垃圾收集永远不会在样本期间发生,但如果某些代码导致大量垃圾收集,它可能会极大地导致速度下降而不会出现在样本中。
在类似情况下,我发现运行两次非常有帮助,一次使用跟踪,一次使用采样。如果一种方法同时出现在两者中,则它可能使用了大量 CPU,否则它很可能只是采样过程的产物。
关于java - 在 Java 中分析 native 方法 - 奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1095434/