0

我最近了解到对象可以放置在堆栈上或堆上,并且放置位置由逃逸分析确定。(声明包含 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 循环之后更改/访问对象的内容,为什么将对象测试放在堆上?

4

2 回答 2

0

test是 main 方法的局部引用变量。所有局部变量都存储在堆栈中。这是一张图片,可让您了解堆上发生了什么以及堆栈上发生了什么:

在此处输入图像描述

于 2013-09-15T12:54:01.527 回答
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循环

于 2013-09-15T13:20:27.463 回答