Điều này phụ thuộc vào JVM. Các phiên bản của JVM của Oracle mà tôi đã thử (1.6.0_41 và 1.7.0_09) không thực hiện tối ưu hóa này theo mặc định. Tuy nhiên, 1.7.0_09 thực hiện nó khi tối ưu hóa tích cực được bật.
Dưới đây là là kiểm tra tôi đã thực hiện:
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("-----");
}
}
}
Sử dụng JVM 1,7 với các thiết lập mặc định, f1()
liên tục chạy ra khỏi bộ nhớ sau 3195 lần lặp lại, trong khi f2()
thống nhất quản lý 3205 lần lặp lại.
Hình ảnh thay đổi nếu mã được chạy bằng Java 1.7.0_09 với -XX:+AggressiveOpts -XX:CompileThreshold=1
: cả hai phiên bản có thể thực hiện 3205 lần lặp lại, cho biết HotSpot thực hiện tối ưu hóa này trong trường hợp này. Java 1.6.0_41 không xuất hiện để làm điều này. Trong thử nghiệm của tôi, hạn chế phạm vi của mảng có cùng tác dụng như thiết lập tham chiếu null
và có lẽ nên là lựa chọn ưu tiên nếu bạn cảm thấy bạn nên giúp JVM thu thập mảng càng sớm càng tốt.
có thể, có thể. – Cubic
Bạn chỉ có thể bao quanh mã bằng dấu ngoặc vuông. – MikeTheLiar
'dữ liệu = null' làm cho nó đủ điều kiện để được thu gom rác. –