我最近了解到对象可以放置在堆栈上或堆上,并且放置位置由逃逸分析确定。(声明包含 64 个元素的多个数组比声明包含 65 个元素的数组快 1000 倍)
在下面的例子中,我认为对象“test”被放置在堆上,使得运行时间更长:
public static void main(String args[]) {
double start = System.nanoTime();
long job = 100000000;// 100 million
int total = 0;
for (long i = 0; i < job; i++) {
int j = 0;
double[] test = new double[63];
test[0] =1;
total += test[0];
while (true) {
if (j == 0)
break;
j--;
}
test[0] = 10; // this makes a really big difference
}
double end = System.nanoTime();
System.out.println("Total runtime = " + (end - start) / 1000000 + " ms" + " total ="+ total);
}
如果删除了 while 循环或“test[0] = 10;” 声明,对象测试被放置在堆栈上(我从在这种情况下没有调用垃圾收集器的事实得出这一点,而当两者都存在时。运行时间是 350 毫秒而不是 6803 毫秒)。
我的问题是,如果我在 while 循环之后更改/访问对象的内容,为什么将对象测试放在堆上?