यह जेवीएम पर निर्भर करता है। ओरेकल के जेवीएम के संस्करण जो मैंने कोशिश की है (1.6.0_41 और 1.7.0_0 9) डिफ़ॉल्ट रूप से इस अनुकूलन को निष्पादित न करें। हालांकि, 1.7.0_0 9 आक्रामक अनुकूलन चालू होने पर इसे निष्पादित करता है।
यहाँ परीक्षण मैं आयोजित किया है:
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 पुनरावृत्तियों प्रबंधन करता है।
यदि कोड जावा 1.7.0_09 -XX:+AggressiveOpts -XX:CompileThreshold=1
के साथ कोड चलाया जाता है तो चित्र बदलता है: दोनों संस्करण 3205 पुनरावृत्तियों कर सकते हैं, यह दर्शाता है कि हॉटस्पॉट इस मामले में इस अनुकूलन को निष्पादित करता है। जावा 1.6.0_41 ऐसा करने के लिए प्रतीत नहीं होता है।
मेरे परीक्षण में, सरणी के दायरे को प्रतिबंधित करने के संदर्भ में null
को सेट करने के समान प्रभाव पड़ता है, और यदि आपको लगता है कि आपको जेवीएम को सरणी एएसएपी एकत्र करने में मदद करना चाहिए तो शायद पसंदीदा विकल्प होना चाहिए।
शायद, शायद। – Cubic
आप कोड को ब्रैकेट से घिरा सकते हैं। – MikeTheLiar
'data = null' इसे कचरा-एकत्रित करने योग्य बनाता है। –