दिलचस्प पोस्ट
स्ट्रिंग में प्रत्येक वर्ण के लिए रिलीज़ संस्करण में कीड़े के सामान्य कारण डीबग मोड में मौजूद नहीं हैं Uncaught सिंटेक्स त्रुटि: JSON.parse के साथ अनपेक्षित टोकन ASP.NET MVC और AngularJS रूटिंग का उपयोग कैसे करें? । क्लासपैथ और। प्रोजेक्ट – संस्करण नियंत्रण में चेक करें या नहीं? मैं जावा स्कैनर में सीमांकक का उपयोग कैसे करूं? बूटस्ट्रैप-यू मोडल के साथ ui-router का उपयोग करना मौजूदा PowerShell स्क्रिप्ट का स्थान निर्धारित करने का सबसे अच्छा तरीका क्या है? $ _POST बनाम $ _SERVER == 'पोस्ट' आउटलुक वीबीए – प्रत्येक आधे घंटे में कोड चलाइए मैं Ubuntu पर OpenSSL पुस्तकालय कैसे स्थापित करूं? अद्यतन और हटाने के लिए HTTP स्थिति कोड? ग्रुप द्वारा गठबंधन / एक कॉलम को संरेखित करें फ़ाइल या विधानसभा को लोड नहीं किया जा सका 'System.Data.SQLite' Android में कैलेंडर ईवेंट कैसे जोड़ें?

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

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

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

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

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

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

वेब के समाधान से एकत्रित समाधान "स्ट्रिंग लीटरल्स का कूड़ा संग्रह"

यदि एक स्ट्रिंग को संकलन समय पर शाब्दिक रूप से परिभाषित किया जाता है [जैसे: 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() विधि को विवेकानुसार उपयोग करना होगा।