在Java中分析本机方法 - 奇怪的结果

ava*_*lys 5 java macos profiling native yourkit

我一直在使用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分钟
方法1:20%
方法2:20%
方法3:20%
StrictMath.atan:40%

结果简化,纯Java atan
总运行时间:10分钟
方法1:33%
方法2:33%
方法3:33%

(方法1,2,3不执行任何atan调用)

知道这种行为是什么吗?我使用EJ-Technologies的JProfiler获得了相同的结果.似乎JDK概要分析API报告了本机方法的不准确结果,至少在OS X下是这样.

Nic*_*cue 3

发生这种情况的原因是采样时间不一致。例如,如果一个方法使用了相当多的时间,但执行时间并不长,则采样可能会错过它。另外,我认为垃圾收集在示例期间永远不会发生,但如果某些代码导致大量垃圾收集,它可能会极大地导致速度减慢,而不会出现在示例中。

在类似的情况下,我发现运行两次非常有帮助,一次是跟踪,一次是采样。如果某个方法同时出现在两者中,则它可能会使用大量 CPU,否则它很可能只是采样过程的产物。