मैंने कई बार सुना है कि एक बार सी # प्रबंधित प्रोग्राम ओएस से अधिक मेमोरी का अनुरोध करता है, यह तब तक मुक्त नहीं होता है जब तक कि सिस्टम स्मृति से बाहर न हो। उदाहरण के लिए। जब ऑब्जेक्ट एकत्र किया जाता है, तो यह हटा दिया जाता है, और ऑब्जेक्ट द्वारा कब्जा कर लिया गया स्मृति किसी अन्य प्रबंधित ऑब्जेक्ट द्वारा पुन: उपयोग करने के लिए स्वतंत्र होता है, लेकिन स्मृति स्वयं ऑपरेटिंग सिस्टम पर वापस नहीं आती है (उदाहरण के लिए, यूनिक्स पर मोनो brk
/sbrk
पर कॉल नहीं करेगा इस प्रक्रिया में उपलब्ध वर्चुअल मेमोरी की मात्रा को उसके आवंटन से पहले जो कुछ भी था उससे कम करें)।मोनो/.Net जीसी संग्रह के बाद ओएस को वापस आवंटित स्मृति आवंटित करता है? यदि नहीं, क्यों?
मुझे नहीं पता कि यह वास्तव में होता है या नहीं, लेकिन मैं देख सकता हूं कि मेरे सी # अनुप्रयोग, लिनक्स पर चल रहे हैं, शुरुआत में छोटी मात्रा में स्मृति का उपयोग करते हैं, फिर जब मैं कुछ मेमोरी महंगा करता हूं, तो यह अधिक आवंटित करता है , लेकिन बाद में जब सभी ऑब्जेक्ट हटा दिए जाते हैं (मैं इसे डिफगर्स को डीबग संदेश डालकर सत्यापित कर सकता हूं), स्मृति को मुक्त नहीं किया जाता है। दूसरी तरफ जब मैं उस मेमोरी महंगे ऑपरेशन को फिर से चलाता हूं तो कोई और स्मृति आवंटित नहीं की जाती है। कार्यक्रम केवल समाप्त होने तक उसी मात्रा में स्मृति खाने पर रहता है।
शायद यह मेरी गलतफहमी है कि नेट में जीसी कैसे काम करता है, लेकिन अगर यह वास्तव में इस तरह काम करता है, तो वह क्यों है? आवंटित स्मृति को बाद में सिस्टम में वापस लौटने की बजाय, इसका लाभ क्या है? यह कैसे पता चलेगा कि सिस्टम को इसकी आवश्यकता है या नहीं? अन्य प्रभाव के बारे में क्या है जो इस प्रभाव के कारण ओओएम की वजह से दुर्घटनाग्रस्त हो या शुरू नहीं हो सका?
मुझे पता है कि लोग शायद कुछ ऐसा जवाब देंगे जैसे "जीसी आपके द्वारा कभी भी बेहतर मेमोरी प्रबंधित करता है, बस इसकी परवाह नहीं करता" या "जीसी जानता है कि यह सबसे अच्छा क्या करता है" या "इससे कोई फर्क नहीं पड़ता, यह सिर्फ वर्चुअल मेमोरी है "लेकिन इससे कोई फर्क नहीं पड़ता, मेरे 2 जीबी लैपटॉप पर मैं ओओएम चला रहा हूं (और इसके कारण कर्नेल ओओएम किलर शुरू हो जाता है) अक्सर जब मैं किसी भी सी # अनुप्रयोगों को कुछ समय बाद इस गैर जिम्मेदार स्मृति प्रबंधन के कारण चला रहा हूं।
नोट: मैं यह सब लिनक्स में मोनो पर परीक्षण कर रहा था क्योंकि मुझे वास्तव में यह समझने में कठिनाई होती है कि विंडोज़ मेमोरी कैसे प्रबंधित करती है, इसलिए लिनक्स पर डिबगिंग मेरे लिए बहुत आसान है, लिनक्स मेमोरी मैनेजमेंट ओपन सोर्स कोड, विंडोज़ का मेमोरी मैनेजमेंट कर्नेल/नेट मेरे लिए रहस्य है
कोई जवाब नहीं है लेकिन मैं [माओनी स्टीफेंस] (http://channel9.msdn.com/posts/Maoni-Stephens-CLR-45- सर्वर- बैकग्राउंड- जीसी) से लेख/वीडियो खोजने की सलाह देता हूं। वह जीसी लीड डेवलपर है ... – rene
यह एक बहुत ही विशिष्ट लिनक्स मुद्दा है, जो आपने पूछा है। बस [इसे बंद करें] (http://jurjenbokma.com/ApprenticesNotes/turing_off_overcommit.html)। –