/ कॉन्स्टेंट पूल (JVM JDK 6) (सच्चाई के लिए उत्सुक) - जावा, स्ट्रिंग, अपवाद, jvm

कॉन्स्टेंट पूल ("जेवीएम जेडीके 6) में" ए "बनाम 'नई स्ट्रिंग (" बी ")' (सत्य के लिए उत्सुक) - जावा, स्ट्रिंग, अपवाद, जेवीएम

मुझे पता है "a" तथा new String("b") दोनों बनाएंगे "a"या "b" निरंतर पूल में

लेकिन निम्नलिखित कार्यक्रम क्यों नहीं फेंकते हैं outOfMemoryError?

कर देता है new String("b") निरंतर पूल में कुछ भी नहीं बना?

List<String> s = new ArrayList<String>();
// -XX:PermSize=5M
// -XX:MaxPermSize=5M
// why no oom:pergen space throw???? "i" isn"t in constant pool????
for (;;) {
for (int i = 0; i < 1000000; i++) {
s.add(new String("" + i));
}
}

उत्तर:

उत्तर № 1 के लिए 4

नया स्ट्रिंग (...) सामान्य ढेर में ऑब्जेक्ट का निर्माण कर रहा है, इसलिए स्थायी पीढ़ी को सीमित कर दिया गया है "OOME बंद आग। जावा के पुराने संस्करण के साथ आप इसे कॉल कर सकते हैं। परिणामी स्ट्रिंग पर .intern () द्वारा, लेकिन यहां तक ​​कि हाल ही में बदल गया है (कृपया पढ़ें http://java-performance.info/string-intern-in-java-6-7-8/ ब्योरा हेतु)।

जावा 8 में, परमिट पीढ़ी पूरी तरह से चली गई लगती है http://www.infoq.com/articles/Java-PERMGEN-Removed इसलिए जब तक आप विशेष रूप से पुराने संस्करणों को लक्षित नहीं करते हैं, तब तक यह अपनी सीमाओं को खोजने की कोशिश में उल्टा हो सकता है और इसके बजाय Metaspace को समझने की कोशिश कर सकता है।


उत्तर № 2 के लिए 1

मुझे पता है "a" तथा new String("b") दोनों बनाएंगे "a"या "b" निरंतर पूल में

आपका "ज्ञान" गलत है:

  1. आप वास्तव में यहाँ स्ट्रिंग पूल के बारे में बात कर रहे हैं। (निरंतर पूल कक्षा फ़ाइल प्रारूप का हिस्सा है, और चीजें संकलक द्वारा वहां "बनाई गई" हैं, आदि)

  2. जबकि "a" तथा "b" स्ट्रिंग पूल, अभिव्यक्ति में रखा जाएगा new String("b") स्ट्रिंग पूल में एक स्ट्रिंग नहीं बनाता है (या पुन: उपयोग)। यह नियमित ढेर में एक नई स्ट्रिंग ऑब्जेक्ट बनाता है।

प्वाइंट 2 बताता है कि आप केवल स्ट्रिंग्स का उपयोग करके "जेवीएम (जहां यह मौजूद है वहां जेवीएम पर)" भर सकते हैं new String(...).

अगर आप तार को तार में बांधना चाहते हैंपूल, आपको String.intern का उपयोग करने की आवश्यकता है। यदि आपने अपने कोड को निम्न में संशोधित किया है, तो आपको परमेजेन ढेर (जावा 7 और पूर्व में) में एक ओमो को ट्रिगर करने में सक्षम होना चाहिए:

for (;;) {
for (int i = 0; i < 1000000; i++) {
s.add((new String("" + i)).intern());
}
}