Wszystko zależy od maszyny JVM. Wersje JVM Oracle, które wypróbowałem (1.6.0_41 i 1.7.0_09), nie wykonują tej optymalizacji domyślnie. Jednak 1.7.0_09 wykonuje go, gdy włączone są agresywne optymalizacje.
Oto jest test mam przeprowadzać:
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("-----");
}
}
}
Korzystanie JVM 1.7 z ustawieniami domyślnymi, f1()
konsekwentnie zabraknie pamięci po 3195 iteracji, natomiast f2()
konsekwentnie udaje 3205 iteracji.
Obraz zmienia się, jeśli kod jest uruchamiany przy użyciu języka Java 1.7.0_09 z -XX:+AggressiveOpts -XX:CompileThreshold=1
: obie wersje mogą wykonywać iteracje 3205, wskazując, że HotSpot wykonuje tę optymalizację w tym przypadku. Java 1.6.0_41 nie wydaje się tego robić.
W moich testach ograniczenie zakresu tablicy ma taki sam skutek jak ustawienie odniesienia null
, i powinno być prawdopodobnie preferowanym wyborem, jeśli uważasz, że powinieneś pomóc JVM zebrać tablicę jak najszybciej.
może, prawdopodobnie. – Cubic
Można po prostu otoczyć kod nawiasami. – MikeTheLiar
'data = null' powoduje, że kwalifikuje się do zbierania śmieci. –