为什么后续数组放在堆而不是Java中的堆栈中

时间:2013-09-15 12:50:03

标签: java arrays escape-analysis

我最近学到的对象可以放在堆栈上或堆上,放置它的位置由转义分析决定。 (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循环之后更改/访问对象的内容,对象测试会放在堆上吗?

2 个答案:

答案 0 :(得分:0)

test是main方法的本地引用变量。所有局部变量都存储在堆栈中。这是一个图像,让你了解堆上的内容和堆栈上的内容:

enter image description here

答案 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无法“删除”