当我在 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个调用,我在分析结束时会看到这些调用。但是,我得到的结果显示每种方法的调用次数显着减少,并且对于这三种方法中的每种方法它们也是不同的。
我很好奇导致这种情况的原因,以及是否可以获得每种方法的实际调用次数。
以下是结果的屏幕截图:
我做了一些挖掘,发现这个bug report讨论了java热点编译器中的内部方法和方法内联。 建议的修复是使用jdk1.6的-Xint选项。但是,在JDK 1.7上,这不会改变我的结果。
答案 0 :(得分:1)
如果您使用的是采样模式,则需要这样做。探查器使用堆栈采样来估计每种方法的进入/退出次数以及该特定方法的持续时间。
由于采样,调用数字在某些情况下可能完全关闭 - 比如在循环中运行非常短的方法。例如。当5个样本连续命中短方法作为堆栈顶部时,它将被计为一次调用,因为从采样器的POV开始,短方法永远不会退出。
时间数据在采样中更加精确 - 唯一的分隔符是采样频率。
如果您希望确切的调用计数切换到已检测的性能分析模式。否则你需要采取一些盐的采样调用。