这依赖于JVM。我尝试过的Oracle JVM版本(1.6.0_41和1.7.0_09)默认情况下不会执行此优化。但是,1.7.0_09确实会在开启积极优化时执行此操作。
这里是我进行的测试:
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次迭代,而f2()
持续管理3205次迭代。如果代码是用Java 1.7.0_09运行与-XX:+AggressiveOpts -XX:CompileThreshold=1
的情况发生了变化:两个版本都可以做3205次迭代,这说明热点确实执行在这种情况下,这种优化。 Java 1.6.0_41似乎没有这样做。
在我的测试,限制阵列的范围有作为设定参考null
相同的效果,而且也许应该是首选,如果你觉得你应该帮助JVM收集阵列尽快。
来源
2013-03-05 20:40:13
NPE
。 – Cubic 2013-03-05 20:32:27
你可以用括号括住代码。 – MikeTheLiar 2013-03-05 20:32:41
'data = null'使其有资格被垃圾收集。 – 2013-03-05 20:32:42