我一直在使用JProfiler来分析一段通过JNI调用本机C代码的Java代码,我从“CPU视图”窗口得到了奇怪的结果。特别是,“调用树”选项卡上的信息告诉我,调用本机代码的Java方法占用运行时间的最大部分,但“热点”选项卡甚至根本不列出该方法。我也注意到org.joda.time类的一个类似的故事,据报道它有相当大的CPU但没有被报告为热点,我想知道这是因为他们花了很多时间调用原生日期转换代码。
对此问题的任何见解都将不胜感激。
编辑:我刚刚发现了一篇非常令人不安的学术论文,题为“评估Java Profilers的准确性”(我会提供一个链接,但似乎科罗拉多大学服务器引用此文件的Google结果现在非常不满意,所以我不得不从谷歌的“快速浏览”链接中删除一份副本。我怀疑本机方法的问题在于它们被过度计数,因为它们有很多调用,它们很短并且调用很可能导致屈服点;但是,我不确定是否同样适用于时间转换例程。请注意,在同一测试运行中使用检测分析和采样分析时,我会得到明显不同的结果,并且检测结果与我的直觉更好地吻合。我把这篇论文推荐给那些曾经发现自己在分析运行结果上摸不着头脑的人。仍然希望有人能够获得更多关于此的信息; “剖析器错了”并不是一个非常令人欣慰的结果。编辑2:看起来像colorado.edu已自行解决,这里是链接:http://www-plan.cs.colorado.edu/klipto/mytkowicz-pldi10.pdf
答案 0 :(得分:2)
热点视图显示具有大固有时间的方法。在调用树视图中,您可以看到调用树顶部的总时间较长的方法。这些方法通常不是热点。
什么被视为“固有时间”取决于您的过滤器的配置方式。
有关详细说明,请参阅this help topic。