java - 在 Java 中分析 native 方法 - 奇怪的结果

标签 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 分钟
方法一: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/

相关文章:

java - 在 package-info.java 中使用 JavaDoc 的导入

java - JXTable 排序不正确

ruby-on-rails - 如何从/usr/bin/rails 中删除 Rails 安装

c - 使用 perf 分析 sleep 时间

java - java中找不到符号

java - JAXB Fragment Marshal 不带命名空间

c++ - 我如何摆脱这些警告?

macos - svn 要求在更新到 MacOS Sierra 后升级工作副本

python - 如何防止pycallgraph进入标准库函数?

profiling - 如何在 Swift 中检测和调试强引用循环?