शायद थोड़ा देर हो चुकी है, लेकिन वर्तमान स्पष्टीकरण मेरे लिए पूरी तरह असंतोषजनक है और मुझे लगता है कि मुझे एक और समझदार स्पष्टीकरण मिला है।
सभी जावा जीसी पहले रूट रूट से किसी तरह का ट्रेसिंग करता है। इसका मतलब है कि यदि पुराना सिर एकत्र किया जाता है तो हम next
वैरिएबल को किसी भी तरह से नहीं पढ़ेंगे - ऐसा करने का कोई कारण नहीं है। इसलिए IF अगले पुनरावृत्ति में सिर एकत्र किया जाता है इससे कोई फर्क नहीं पड़ता।
उपर्युक्त वाक्य में आईएफ यहां महत्वपूर्ण हिस्सा है। कुछ अलग के बगल में सेटिंग के बीच का अंतर सिर एकत्र करने के लिए कोई फर्क नहीं पड़ता है, लेकिन अन्य वस्तुओं के लिए एक अंतर बना सकता है।
चलो एक साधारण पीढ़ी जीसी मानते हैं: यदि सिर युवा सेट में है, तो इसे अगले जीसी में किसी भी तरह से एकत्र किया जाएगा। लेकिन अगर यह पुराने सेट में है तो यह केवल तभी एकत्र किया जाएगा जब हम एक पूर्ण जीसी करते हैं जो शायद ही कभी होता है।
तो क्या होता है यदि सिर पुराने सेट में है और हम एक युवा जीसी करते हैं?इस मामले में जेवीएम मानता है कि पुराने ढेर में हर वस्तु अभी भी जिंदा है और युवा जीसी के लिए रूट सेट में पुराने से युवा वस्तुओं से प्रत्येक संदर्भ जोड़ती है। और यही वही है जो असाइनमेंट से बचाता है: पुरानी ढेर में लिखना आमतौर पर एक लिखने की बाधा या कुछ के साथ संरक्षित होता है ताकि JVM ऐसे असाइनमेंट को पकड़ सके और उन्हें सही तरीके से संभाल सके - हमारे मामले में यह ऑब्जेक्ट next
रूट सेट से इंगित करता है जिसके परिणाम हैं।
लघु उदाहरण:
मान लें हम 1 (old) -> 2 (young) -> 3 (xx)
है। अगर हम अपनी सूची से अब 1 और 2 हटा देते हैं, तो हम उम्मीद कर सकते हैं कि दोनों तत्व अगले जीसी द्वारा एकत्र किए जाएंगे। लेकिन अगर केवल एक युवा जीसी होता है और हमने पुराने में next
पॉइंटर को नहीं हटाया है, तो तत्व 1 और 2 एकत्र नहीं किए जाएंगे। इसके विपरीत हम 1 में सूचक को हटा दिया है, तो, 2 जवान जीसी द्वारा एकत्र की जाएगी ..
शायद टिप्पणी पुरानी है (आप संस्करण नियंत्रण ढूंढकर टिप्पणी को ट्रैक करने के लिए कर सकते हैं?) :) – milan
यह दिलचस्प है कि इस अस्थायी वर और टिप्पणी केवल में जोड़ा गया जावा 7. तो यह कुछ इरादे से निश्चित रूप से था। Http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/LinkedBlockingQueue.java#LinkedBlockingQueue.extract%28%29 और http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/concurrent/LinkedBlockingQueue.java#LinkedBlockingQueue.dequeue%28%29 – Vadzim
जो ओपनजेडके है, ओरेकल के लिंकडब्लॉकिंग क्यूयू मैक पर jdk 6 (1.6.0_29-b11-402.jdk) में temp चर है। – milan