我最近学到的对象可以放在堆栈上或堆上,放置它的位置由转义分析决定。 (Declaring multiple arrays with 64 elements 1000 times faster than declaring array of 65 elements)
在下面的例子中,我认为对象“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循环之后更改/访问对象的内容,对象测试会放在堆上吗?
答案 0 :(得分:0)
test
是main方法的本地引用变量。所有局部变量都存储在堆栈中。这是一个图像,让你了解堆上的内容和堆栈上的内容:
答案 1 :(得分:0)
此外,运行时间为350毫秒而不是6803毫秒
我认为它不是关于堆栈/堆而是优化。我不确定Java JIT优化是如何工作的,但优化后C / C ++中的类似代码如下所示:
public static void main(String args[]) {
double start = System.nanoTime();
long job = 100000000;// 100 million
int total = 100000000;
double end = System.nanoTime();
System.out.println("Total runtime = " + (end - start) / 1000000 + " ms" + " total ="+ total);
}
也许你参考测试:
test[0]=10;
导致for-loop无法“删除”