2011-11-19 18 views
12

यह एक सवाल है जिसे मैंने हाल ही में अपने साक्षात्कार में पूछा था: 'जीसी.कोलेक्ट()' कॉल के दौरान कौन सी 'यादृच्छिक' वस्तु एकत्र की जाएगी?इनमें से कौन सा ऑब्जेक्ट कचरा संग्रहण के लिए योग्य है?

String a = new Random().Next(0, 1) ==1 ? "Whatever 1" : "Whatever 2"; 

String b = new WeakReference(new Random()).Target.Next(0, 1) == 1 ? 
    "Whatever 1" : "Whatever 2"; 

GC.Collect(); 

मैंने जवाब है कि यह एक कार्यान्वयन-विशिष्ट सवाल है और यह अत्यधिक GC कार्यान्वयन और इसी कमजोर संदर्भ अर्थ विज्ञान पर निर्भर करता है। जहां तक ​​मुझे पता है, सी # विनिर्देश GC.Collect के सटीक वर्णन प्रदान नहीं करता है और कमजोर संदर्भों को कैसे संभाला जाना चाहिए।

हालांकि, मेरा साक्षात्कारकर्ता कुछ और सुनना चाहता था।

+3

आप बहुत विनम्र थे। मेरा जवाब होगा यदि मायने रखता है कि कुछ गड़बड़ है .... –

+0

बहुत अच्छा होगा अगर इस प्रश्न में 'जावा' टैग भी जोड़ा जाता है। – Bhushan

उत्तर

13

दोनों Random() उदाहरणों और WeakReference संग्रह के लिए पात्र हैं:

  • पहले Random एक स्थानीय में जमा नहीं किया गया था, अकेले एक स्थानीय है कि बाद में पढ़ा जाता है।
  • दूसरा Random एक WeakReference को पारित किया गया था, इसलिए वैसे भी इकट्ठा करने के लिए ठीक होगा, लेकिन WeakReferenceही कहीं भी नहीं रखा जाता है, ताकि भी संग्रह के लिए पात्र है।

स्ट्रिंग्स में से कोई भी नहीं है (यहां केवल 2 स्ट्रिंग इंस्टेंस हैं, 4 नहीं, भले ही प्रत्येक संभावित कोड पथ तक पहुंचा हो): क्योंकि वे सी # कोड में अक्षर हैं, वे मौजूद होने के बाद इंटर्न किए जाते हैं।

+0

हाँ, जाहिर है, सवाल 'रैंडम' ऑब्जेक्ट्स के बारे में था, क्षमा करें, कि मैं इसका उल्लेख करना भूल गया। –

+0

अब, क्या कोई कह सकता है कि मेरा जवाब गलत है और सही जवाब है कि ** दोनों हैं? ** –

+0

हां; स्पष्ट - अद्यतन –

9

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

साक्षात्कारकर्ता क्या चाहता था कि आप सबसे अधिक संभावना है कि यह जांचने के लिए कि कौन सी वस्तुएं जीसी के कॉल पर अभी भी पहुंच योग्य हैं। एक "सही" कार्यान्वयन मानते हुए चयन करें जो जल्द से जल्द सबकुछ छोड़ देता है।

+0

डाउनवोट क्यों? यह जानना महत्वपूर्ण है कि जीसी व्यवहार से जुड़े कोडिंग यूनिट परीक्षणों में, मैं यहां अनुभव से बात कर रहा हूं। मैंने जाहिर तौर पर साक्षात्कारकर्ता जो सुनना चाहता था और तकनीकी वास्तविकता क्या है, के बीच एक अंतर बना दिया। – Zarat

+0

+1 मैंने पढ़ा पहला सही उत्तर होने के लिए। "एक पूर्ण कार्यान्वयन मानते हैं"। यह देखते हुए कि सवाल बकवास है, मैं साक्षात्कारकर्ता के विचारों के बारे में अनुमान लगाता हूं कि वे क्या पूछ रहे थे। –

1

GC.Collect System.gc के जावा समकक्ष()

यह "की सिफारिश की" उन्हें हटाने के लिए शून्य मान के लिए जाँच करने में की तरह है। आप वास्तव में इस सुविधा पर निर्भर नहीं हो सकते क्योंकि यह वास्तव में सी ++ के विपरीत स्वचालित है।

उम्मीद है कि यह मदद करता है!

3

हालांकि, मेरा साक्षात्कारकर्ता कुछ और सुनना चाहता था।

मैं वे एक मार्क Gravell की तरह एक जवाब यहाँ पोस्ट किया गया है लेकिन यह है कि कैसे कचरा एकत्र आभासी मशीनों काम का एक अति सरल मॉडल है कि वास्तविकता के लिए कोई समानता भालू पर आधारित है सुनना चाहते थे की उम्मीद है।

उदाहरण के लिए, GC.Collect पर कॉल को पूंछ कॉल अनुकूलित किया जा सकता है, जिस स्थिति में कोई वैश्विक जड़ें नहीं हैं, इसलिए सभी ढेर-आवंटित ब्लॉक एकत्र किए जाते हैं। या संकलक हर अस्थायी (केवल स्रोत कोड में चर नहीं) के लिए स्टैक फ्रेम पर एक नई प्रविष्टि बना सकता है जो सबकुछ पहुंचने योग्य रहता है और कुछ भी एकत्र नहीं किया जाता है।या संकलक तार a और b के निर्माण के क्रम में स्वैप और इकट्ठा हो सकता है Random वस्तु Target विधि से पहले WeakReference से जाना जाता एक null संदर्भ अपवाद के कारण उत्पन्न होता है तो अन्य Random भी आवंटित कभी नहीं किया गया है।

+0

क्या मतलब है तारों को स्वैप करें, और यह 'वीक रेफरेंस' से प्रासंगिक कैसे है? –

+0

मेरा मतलब है 'नया वीक रेफरेंस (नया रैंडम()) निष्पादित करें। Target.Next (0, 1) == 1? "जो कुछ भी 1": "नया जो भी" 'नया रैंडम() निष्पादित करने से पहले। अगला (0, 1) == 1? "जो भी 1": "जो भी 2" '। –

+0

ओह मुझे उसमें से आधा याद आया, 'वीक रेफरेंस' लक्ष्य का प्रारंभिक संग्रह + अपवाद किसी भी क्रम में हो सकता है, यह सिर्फ इतना है कि अगर यह पुन: व्यवस्थित किया जाता है तो यह केवल अन्य 'यादृच्छिक' को प्रभावित करता है। और इस मामले में संकलक पुन: व्यवस्थित करने के लिए स्वतंत्र है क्योंकि 'कोई भी कभी नहीं जानता'। –