2

当我在NetBeans 7.1中使用分析器时,我没有看到我的方法的预期调用编号。

为了测试这一点,我创建了一个简单的程序,它有 3 个方法,每个方法被调用一万次。

public class profilerTest {
    static int one;
    static int two;
    static int three;

    public static void main(String args[]) {
        for (int i = 0 ;i<= 10000; i++)one();
    }

    public static void one() {
        System.out.println("one:" + one++);
        two();
    }

    public static void two() {
        System.out.println("two:" + two++);
        three();
    }

    public static void three() {  
        System.out.println("three:" + three++);
    }
}

我希望在我在分析结束时拍摄的分析器快照中看到每个方法 10000 次调用。但是,我得到的结果显着降低了每种方法的调用次数,并且三种方法中的每一种都不同。

我很好奇导致这种情况的原因,以及是否以及如何获得每种方法的实际调用计数。

这是结果的屏幕截图:

在此处输入图像描述

我做了更多的挖掘,发现了这个关于 Java 热点编译器中的内部方法和方法内联的错误报告。建议的修复是对 jdk1.6 使用 -Xint 选项。然而,在 JDK 1.7 上,这不会改变我的结果。

4

1 回答 1

1

如果您使用的是采样模式,这是预期的。分析器使用堆栈采样来估计每个方法的进入/退出数量以及该特定方法的持续时间。

由于采样,在某些情况下调用次数可能会完全关闭——比如在循环中多次运行非常短的方法。例如。当 5 个样本连续命中作为堆栈顶部的短方法时,它将被计为一次调用,因为从采样器的 POV 来看,短方法从未退出。

时间数据在采样中要精确得多——唯一的分隔符是采样频率。

如果您想要准确的调用计数,请切换到检测分析模式。否则,您需要对抽样调用持保留态度。

于 2013-03-07T23:10:01.910 回答