我一直在使用 JProfiler 分析一段通过 JNI 调用本机 C 代码的 Java 代码,并且我从“CPU Views”窗口得到了奇怪的结果。特别是,“调用树”选项卡上的信息告诉我,调用本机代码的 Java 方法消耗了最高部分的运行时间,但“热点”选项卡甚至根本没有列出该方法。我还注意到 org.joda.time 类的类似故事,据报道它们有相当大的一部分 CPU,但没有被报告为热点,我想知道这是否是因为它们花费大量时间调用本机日期转换代码。
对此问题的任何见解将不胜感激。
编辑:我刚刚发现了一篇非常令人不安的学术论文,题为“Evaluating the Accuracy of Java Profilers”(我会提供一个链接,但看起来这个文件的谷歌结果引用的科罗拉多大学服务器现在非常不开心,所以我必须从 Google 的“快速查看”链接中下载一份副本)。我怀疑本机方法的问题在于它们被多计了,因为对它们的调用很多,它们很短,并且调用可能会导致屈服点;但是,我不确定这是否适用于时间转换例程。请注意,在对同一测试运行使用插桩分析和采样分析时,我得到了显着不同的结果,并且插桩结果更符合我的直觉。我将这篇论文推荐给那些对分析运行的结果摸不着头脑的人。不过,仍然希望有人对此有更多信息;“分析器错误”不是一个非常令人欣慰的结果。
编辑 2: 看起来 colorado.edu 已经整理好了,这是链接:http ://www-plan.cs.colorado.edu/klipto/mytkowicz-pldi10.pdf