これはJVMによって異なります。試したオラクルのJVM(1.6.0_41および1.7.0_09)のバージョンでは、デフォルトでこの最適化が実行されません。ただし、積極的な最適化を有効にすると、1.7.0_09が実行されます。
ここにありますが、私が行ってきたテストです:f2()
は一貫3205回の繰り返しを管理し、一方、
public class Main {
public static int g() {
int n = 100000;
int arr[][] = new int[n][];
for (int i = 0; i < n; ++i) {
try {
arr[i] = new int[100000];
} catch (OutOfMemoryError ex) {
return i;
}
}
return -1;
}
public static void f1() {
int arr[] = new int[1000000];
System.out.println(g());
}
public static void f2() {
int arr[] = new int[1000000];
arr = null;
System.out.println(g());
}
public static void main(String[] argv) {
for (int j = 0; j < 2; ++j) {
for (int i = 0; i < 10; ++i) {
f1();
}
System.out.println("-----");
for (int i = 0; i < 10; ++i) {
f2();
}
System.out.println("-----");
}
}
}
デフォルト設定でJVM 1.7を使用して、f1()
は一貫して、3195回の繰り返しの後にメモリ不足します。
Java 1.7.0_09と-XX:+AggressiveOpts -XX:CompileThreshold=1
を使用してコードを実行した場合、画像が変更されます。両方のバージョンで3205回の反復ができます。この場合、HotSpotはこの最適化を実行します。 Java 1.6.0_41ではこれが行われていないようです。
私のテストでは、配列の範囲を制限することは参照null
を設定するのと同じ効果があり、JVMが配列をできるだけ早く収集するのに役立つと思われる場合は、おそらく好ましい選択です。
出典
2013-03-05 20:40:13
NPE
おそらく、多分。 – Cubic
括弧でコードを囲むことができます。 – MikeTheLiar
'data = null'はガベージコレクションの対象となります。 –