स्ट्रिंग पर स्ट्रिंग के शाब्दिक संग्रहित नहीं हैं। कभी नहीँ। वास्तव में, स्टैक पर कोई ऑब्जेक्ट संग्रहीत नहीं किया जाता है।
स्ट्रिंग शाब्दिक (या अधिक सही, स्ट्रिंग वस्तुओं है कि उन्हें प्रतिनिधित्व करते हैं) कर रहे हैं ऐतिहासिक रूप से एक ढेर में जमा हो रहे थे "permgen" ढेर कहा जाता है। (स्थायी पीढ़ी के लिए परमिटेन छोटा है।)
सामान्य परिस्थितियों में, स्ट्रिंग के शाब्दिक और परमिटेन ढेर में अन्य सामान "स्थायी रूप से" पहुंच योग्य हैं, और कचरा एकत्र नहीं किया जाता है। (उदाहरण के लिए, स्ट्रिंग लिटरल्स हमेशा कोड ऑब्जेक्ट्स से उपयोग करने योग्य होते हैं जो उनका उपयोग करते हैं।) हालांकि, आप गतिशील रूप से भरी हुई कक्षाओं को खोजने और इकट्ठा करने के प्रयास के लिए एक जेवीएम को कॉन्फ़िगर कर सकते हैं, जिनकी अब आवश्यकता नहीं है, और इससे स्ट्रिंग शाब्दिक को कचरा एकत्र किया जा सकता है। ।
CLARIFICATION # 1 - मैं यह नहीं कह रहा हूँ कि Permgen को GC'ed नहीं मिलता है। यह तब होता है, आमतौर पर जब JVM एक पूर्ण GC चलाने का निर्णय लेता है। मेरा कहना यह है कि स्ट्रिंग शाब्दिक तब तक पहुंच योग्य होगा जब तक कि उनका उपयोग करने वाला कोड पहुंच योग्य न हो, और कोड तब तक पहुंच योग्य रहेगा जब तक कोड का लोडर लोड करने योग्य हो, और डिफ़ॉल्ट क्लास लोडर के लिए, जिसका अर्थ है "हमेशा के लिए"।
क्लैरिएशन # 2 - वास्तव में, जावा 7 और बाद में स्ट्रिंग पूल को पकड़ने के लिए नियमित ढेर का उपयोग करता है। इस प्रकार, स्ट्रिंग ऑब्जेक्ट्स जो स्ट्रिंग शाब्दिक और इंटरनल स्ट्रिंग्स का प्रतिनिधित्व करते हैं, वास्तव में नियमित रूप से ढेर में होते हैं। (विवरण के लिए @ assylias का उत्तर देखें।)
लेकिन मैं अभी भी स्ट्रिंग शाब्दिक और स्ट्रिंग के भंडारण के बीच पतली रेखा का पता लगाने की कोशिश कर रहा हूं new
।
कोई "पतली रेखा" नहीं है। यह वास्तव में बहुत सरल है:
String
स्ट्रिंग पूल में स्ट्रिंग शाब्दिक का प्रतिनिधित्व / अनुरूप करने वाली वस्तुएं आयोजित की जाती हैं।
String
एक String::intern
कॉल द्वारा बनाई गई वस्तुओं को स्ट्रिंग पूल में आयोजित किया जाता है।
- अन्य सभी
String
ऑब्जेक्ट स्ट्रिंग पूल में नहीं रखे गए हैं।
फिर अलग सवाल है कि स्ट्रिंग पूल "संग्रहीत" कहां है। जावा 7 से पहले यह परमेजन ढेर था। जावा 7 के बाद से यह मुख्य ढेर है।