私は最近、オブジェクトをスタックまたはヒープに置くことができ、どこに置かれるかはエスケープ解析によって決定されることを学びました。( 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 ループの後にオブジェクトのコンテンツを変更/アクセスすると、オブジェクト テストがヒープに配置される理由です。