दिलचस्प पोस्ट
संस्करण नियंत्रण में परियोजनाओं की संरचना यूनिट का परीक्षण और निजी वैरिएबल वैल्यू जांचना डेटाफ़्रेम में एक समूहिंग चर के आधार पर लगातार इंडेक्स कैसे बनाएं क्या मैं विंडोज के अंतर्गत सक्रिय प्रक्रिया के एसटीडीआईएन को कुछ पाठ भेज सकता हूं? SQL सर्वर में सशर्त WHERE खंड पाठ फ़ाइल में पूर्णांक राशि का सबसे तेज़ तरीका स्रोत से एंड्रॉइड बनाने के बाद इम्यूलेटर चला रहा है क्यों वैश्विक चर 'नाम' स्ट्रिंग में परिवर्तन? -webkit-transform का उपयोग करते समय निर्धारित स्थिति काम नहीं करती आईओएस में तालिका दृश्य कोशिकाओं का विस्तार और संक्षिप्त करना मैं कैसे जांच करूं यदि कोई वर्ण एक स्वर है? संकलन समय पर एक स्थिरता समारोह का मूल्यांकन कब होता है? एक्सेल VBA- एक सेल में डुप्लिकेट वैल्यू के साथ पंक्तियों का संयोजन करें और अन्य सेल में वैल्यू मर्ज करें IPhone अनुप्रयोग में UITableView में अनुभाग अनुक्रमित कस्टमाइज़ करना सिद्धांत बनाने के लिए प्रत्येक इकाई के लिए एक चेकबॉक्स वाला एक फ़ॉर्म बनाएं

स्ट्रिंग लीटरल्स का कूड़ा संग्रह

मैं कचरा संग्रह के बारे में पढ़ रहा हूं और जब मैं स्ट्रिंग शाब्दिक कचरा संग्रह की खोज करता हूं तो मुझे भ्रमित खोज परिणाम मिल रहा है।

मुझे निम्नलिखित बिंदुओं पर स्पष्टीकरण की आवश्यकता है:

  1. यदि एक स्ट्रिंग को संकलन समय पर शाब्दिक रूप से परिभाषित किया जाता है [जैसे: String str = "java" ] तो क्या यह कचरा एकत्र होगा?

  2. यदि आंतरिक पद्धति का उपयोग करें (जैसे: String str = new String("java").intern() ] तो क्या यह कचरा एकत्र होगा? इसके अलावा इसे स्ट्रिंग लीडरियल से 1 अंक में अलग तरह से व्यवहार किया जाएगा।

  3. कुछ जगहों पर यह उल्लेख किया गया है कि लिट्टेल्स कचरा एकत्रित किए जाएंगे, जब String क्लास अनलोड हो जाएंगे? क्या यह समझ में आता है क्योंकि मुझे नहीं लगता कि String वर्ग कभी भी उतार दिया जाएगा।

Solutions Collecting From Web of "स्ट्रिंग लीटरल्स का कूड़ा संग्रह"

यदि एक स्ट्रिंग को संकलन समय पर शाब्दिक रूप से परिभाषित किया जाता है [जैसे: String str = "java"; ] तो क्या यह कचरा एकत्र होगा?

शायद ऩही। कोड ऑब्जेक्ट्स String ऑब्जेक्ट्स के लिए एक या एक से अधिक संदर्भ होंगे जो कि लीटरल का प्रतिनिधित्व करते हैं। इसलिए जब तक कोड ऑब्जेक्ट्स पहुंच योग्य हैं, तब तक String ऑब्जेक्ट्स होनी चाहिए।

यह कोड ऑब्जेक्ट्स के लिए संभव नहीं हो सकता है, लेकिन अगर वे गतिशील रूप से लोड किए गए हों … और उनके क्लासलोडर को नष्ट कर दिया गया हो।

यदि मैं आंतरिक पद्धति का उपयोग करता हूं [जैसे: String str = new String("java").intern() ] तो क्या यह कचरा एकत्र होगा?

intern कॉल द्वारा लौटा गया ऑब्जेक्ट समान वस्तु है जो "java" स्ट्रिंग का प्रतिनिधित्व करता है। ( "java" शब्दशः क्लास लोडिंग समय पर इंटर्न किया जाता है। जब आप अपने कोड स्निपेट में नव निर्मित String ऑब्जेक्ट को इंटर्न करते हैं, तो यह पहले से "java" स्ट्रिंग को देखने और वापस लौटाएगा।)

हालांकि, आंतरिक स्ट्रिंग जो स्ट्रिंग लीटरल के समान नहीं हैं, एक बार वे पहुंच योग्य नहीं होने पर कचरा एकत्र कर सकते हैं। सभी पुराने हॉटस्पॉट जेवीएम पर पेर्मजेन स्पेस कचरा एकत्र किया गया है। (जावा 8 से पहले … जो पूरी तरह से PermGen बूँदें।)

इसके साथ ही इसे 1 अंक में स्ट्रिंग से शालीन रूप से अलग तरह से व्यवहार किया जाएगा।

नहीं … क्योंकि यह स्ट्रिंग के रूप में एक ही वस्तु है शाब्दिक

और वास्तव में, एक बार जब आप समझते हैं कि क्या हो रहा है, तो यह स्पष्ट है कि स्ट्रिंग लीटरल्स विशेष रूप से किसी भी तरह का इलाज नहीं करते हैं। यह "पहुंच योग्यता" नियम का सिर्फ एक आवेदन है …

कुछ जगहों पर यह उल्लेख किया गया है कि लिट्टेल्स कचरा एकत्रित किए जाएंगे, जब String क्लास अनलोड हो जाएंगे? क्या यह समझ में आता है क्योंकि मुझे नहीं लगता कि String वर्ग कभी भी उतार दिया जाएगा।

तुम सही हो। यह मतलब नहीं है सूत्रों ने कहा है कि गलत हैं। (यह उपयोगी होगा यदि आपने एक यूआरएल पोस्ट किया है ताकि हम यह पढ़ सकें कि वे अपने लिए क्या कह रहे हैं …)

सामान्य परिस्थितियों में, स्ट्रिंग लीटरल्स और कक्षाएं सभी को जेवीएम की स्थायी पीढ़ी ("पेर्मजेन") में आवंटित की जाती हैं, और आमतौर पर कभी भी एकत्र नहीं किया जाएगा। स्ट्रिंग्स जो आंतरिक हैं (उदाहरण के लिए mystring.intern() ) एक स्मृति पूल में स्ट्रेंज क्लास के पास ट्रांसजेस में संग्रहीत हैं, और यह एक बार ऐसा मामला था कि आक्रामक इंटर्निंग एक स्थान रिसाव का कारण हो सकता है क्योंकि स्ट्रिंग पूल में प्रत्येक के संदर्भ में स्ट्रिंग, यहां तक ​​कि कोई अन्य संदर्भ मौजूद नहीं है। जाहिरा तौर पर यह अब सच नहीं है, कम से कम जेडीके 1.6 (देखें, उदाहरण के लिए, यहां )।

परिगेन पर अधिक जानकारी के लिए, यह विषय का एक सभ्य अवलोकन है। (नोट: यह लिंक किसी उत्पाद से जुड़े ब्लॉग पर जाता है। मेरे पास ब्लॉग, कंपनी या उत्पाद के साथ कोई संबंध नहीं है, लेकिन ब्लॉग प्रविष्टि उपयोगी है और इस उत्पाद के साथ बहुत कुछ नहीं है I )

  1. जब तक प्रोग्राम स्मृति में है, तब तक शब्दशः स्ट्रिंग स्मृति में रहेगी
  2. str एकत्र कचरा हो जाएगा, लेकिन यह सचमुच से बनाया गया है नहीं होगा।
  3. यह सही समझ बनाता है, क्योंकि स्ट्रिंग क्लास उतार दिया जाता है जब प्रोग्राम अनलोड होता है।

intern() विधि स्ट्रिंग पूल में ऑब्जेक्ट की उपलब्धता की जांच करता है यदि वस्तु / शाब्दिक उपलब्ध है तो इसके संदर्भ का भुगतान किया जाएगा। यदि शाब्दिक पूल में नहीं है तो ऑब्जेक्ट को पर्म क्षेत्र (स्ट्रिंग पूल) में लोड किया जाता है और फिर इसके संदर्भ में वापसी होगी। हमें intern() विधि को विवेकानुसार उपयोग करना होगा।