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;」ステートメントでは、オブジェクト test がスタックに配置されます (これは、ガベージ コレクターがこの場合呼び出されないという事実から導き出されましたが、両方が存在する場合です。また、実行時間は 6803 ミリ秒ではなく 350 ミリ秒です)。

私の質問は、while ループの後にオブジェクトのコンテンツを変更/アクセスすると、オブジェクト テストがヒープに配置される理由です。

4

2 に答える 2

0

testメインメソッドへのローカル参照変数です。すべてのローカル変数はスタックに格納されます。以下は、ヒープとスタックの内容を理解できるようにするための画像です。

ここに画像の説明を入力

于 2013-09-15T12:54:01.527 に答える