2013-05-31 23 views
7

में कचरा संग्रह के लिए योग्य है क्या मैं पूछ रहा हूं कि एक बेवकूफ सवाल हो सकता है, इसलिए कृपया मुझे क्षमा करें। तो यह इस प्रकार है: बॉस वस्तुओं कीक्या यह जावा ऑब्जेक्ट सूची

बहुत
List<Boss> bossList = new ArrayList<Boss>(); 
Boss b = null; 
for(Employee e : List<Employee> myList){ 
    b = new Boss(); 
    b.setEmployee(e); 
    bossList.add(b); 
    b = null; 
} 
उपरोक्त परिदृश्य में

तो, मैं बनाने रहा हूँ और उसके बाद डी-संदर्भित उन्हें (मुझे लगता है मैं लिखने के लिए "ख = अशक्त" की जरूरत नहीं है पता है, लेकिन मैं यह मेरे प्रश्न की स्पष्टता के लिए किया था)। सामान्य परिदृश्य में, मैं उन्हें डूबे करके कचरा संग्रह में चिह्नित करता, लेकिन इस परिदृश्य में, मैं उन बॉस ऑब्जेक्ट्स को सूची संग्रह में जोड़ रहा हूं, क्या वे जीसी के लिए चिह्नित हैं या नहीं? यदि नहीं तो क्यों? और सूची संग्रह प्रत्येक ऑब्जेक्ट के लिए संदर्भ रखने के लिए आंतरिक रूप से कैसे काम करता है, ताकि कचरा संग्रह से बचने के लिए?

[EDIT] 

प्रश्न के दायरे से केवल व्यक्तिगत बॉस वस्तुओं for पाश में बनाया तक ही सीमित है, पर विचार है कि इस विधि से बाहर की दुनिया के लिए सूची का संदर्भ देता है।

+0

ऑब्जेक्ट स्वयं, जिसे आपने सूची में रखा है, स्पष्ट रूप से जीसी के लिए उपलब्ध नहीं है क्योंकि इसका संदर्भ अभी भी मौजूद है, भले ही आप 'बी' को रद्द कर दें। – NilsH

+0

यदि किसी मौजूदा कार्यक्रम स्थिति में पहुंचने के लिए कोई विशेष तरीका है (विशेष श्रेणी WeakReference और इसके संबंधित वर्गों के माध्यम से छोड़कर) किसी वस्तु को कचरा इकट्ठा नहीं किया जा सकता है। एक संदर्भ, कोई फर्क नहीं पड़ता कि, लाइव कोड से पर्याप्त है। – Patashu

उत्तर

5

ऐरेलिस्ट में Object[] elementData आंतरिक रूप से है। जब आपने b को bossList जोड़ा, तो ऐरेलिस्ट ने elementData[0] = b असाइन किया। तो जब आपने null को b असाइन किया था तो Boss का उदाहरण अभी भी elementData[0] से संदर्भित है और इसे जीसीड नहीं किया जा सकता है। लेकिन ArrayList इंस्टेंस को केवल विधि के चर से संदर्भित किया जाता है जब विधि ArrayList और Boss दोनों उदाहरण देता है तो जीसी के लिए पात्र होंगे।

9

Boss ऑब्जेक्ट्स GarbageCollector द्वारा एकत्र नहीं किए जाएंगे क्योंकि उन्हें अभी भी आपके द्वारा पोस्ट किए गए कोड ब्लॉक में संदर्भित किया गया है। bossList एक ArrayList है जिसमें Object की आंतरिक सरणी है, इस प्रकार उन वस्तुओं को संदर्भित किया गया है जो इसमें जोड़े गए हैं।

मैं ऐसी स्थिति न केवल आपके द्वारा संदर्भों पर विचार किया जाता है बल्कि सभी वस्तुओं में शामिल सभी वस्तुओं में संदर्भित होता है।

संपादित करें: चूंकि आप अपने कोड में सूची लौट रहे हैं, इसलिए ऑब्जेक्ट्स को कचरा संग्रह के लिए चिह्नित नहीं किया जाएगा जब तक कि आपके प्रोग्राम में सूची का संदर्भ नहीं दिया जाता है।

+0

लेकिन विधि के अंदर 'सूची ' घोषित की गई है, तब जब विधि समाप्त होती है, तो सूची जीसी के लिए चिह्नित की जाएगी, इस प्रकार 'बॉस' ऑब्जेक्ट संदर्भों को भी चिह्नित किया जाएगा। –

+0

सही। जैसे ही ब्लॉक जिसमें 'ऐरेलिस्ट' घोषित किया जाता है, सभी वस्तुओं को एकत्रित किया जाएगा (यदि आगे संदर्भित नहीं किया गया है)। –

+0

निश्चित रूप से, यदि आप मानते हैं कि सूची केवल विधि के भीतर मौजूद है। – NilsH

3

यहाँ क्या वास्तव में अपने कोड के साथ क्या होता है:

Hello

-1

के बाद से जावा संदर्भ, जब भी आप जोड़ने के द्वारा पास होना जरूरी है bbossList को, bossList स्मृति स्थान जो ख की ओर इशारा करते है को संदर्भित शुरू होता है। तो जब b संदर्भ में b से केवल लिंक को तोड़ दिया गया है तो टूटा हुआ है। इस प्रकार वस्तु को bossList के माध्यम से सुलभ रखना।

संबंधित मुद्दे