मुझे इस सामान को सीखते हुए काफी समय हो गया है, लेकिन यहाँ जाता है।
जब कोई ऑपरेटिंग सिस्टम एक प्रक्रिया शुरू करता है, तो वह इसे वर्चुअल मेमोरी टेबल से पेज असाइन करता है। ऑपरेटिंग सिस्टम वर्चुअल मेमोरी टेबल से वास्तविक मेमोरी तक या डिस्क पर स्वैप स्पेस के लिए मानचित्र बनाए रखने के लिए जिम्मेदार है। जब एक प्रक्रिया को मार दिया जाता है, तो ओएस इसे सीपीयू चक्र देना बंद नहीं करता है। यह कुछ सफाई आइटम करता है, जिनमें से एक अपने सभी मेमोरी पन्नों को मुफ्त में चिह्नित करना है। यह उन्हें अन्य अनुप्रयोगों द्वारा पुन: उपयोग करने की अनुमति देता है। ओएस संभवतः किसी भी संसाधन हैंडल को साफ कर देगा जो प्रक्रिया के पास थी, स्वचालित रूप से फाइल, नेटवर्क कनेक्शन, प्रोसेस-टू-प्रोसेस पाइप, और इसी तरह बंद करना। यह प्रक्रिया पूरी तरह से OS के नियंत्रण में है, और इन कदमों से कोई फर्क नहीं पड़ता है कि इस प्रक्रिया की मृत्यु कैसे हुई।
यह सब ध्यान में रखते हुए ऑपरेटिंग सिस्टम प्रक्रियाओं पर लागू होता है। यदि आपके पास वर्चुअल मशीन का कुछ तरीका है, और यह एक ही बार में कई वर्चुअल प्रक्रियाएं चला रहा है, तो VM उन्हें आवंटित करने और उनसे निपटने का तरीका तय करने के लिए जिम्मेदार है। ओएस से, हालांकि, यह अभी भी एक प्रक्रिया की तरह दिखता है। तो इस एक मामले में, यदि आपके पास एक वीएम है जो कई प्रक्रियाएं चलाता है, और आप उनमें से एक को वीएम के भीतर मार देते हैं, तो आप शायद होस्ट ओएस में तुरंत मेमोरी वापस नहीं लेंगे। लेकिन आप इसे वीएम में वापस पा लेंगे। यदि आप वीएम को ऑपरेटिंग सिस्टम के भीतर मारते हैं, हालांकि, तो ओएस वीएम को मारने जा रहा है (जो अप्रत्यक्ष रूप से वीएम की प्रक्रियाओं को मारता है) और सभी मेमोरी को पुनः प्राप्त करता है (जिसे कचरा कलेक्टर, मुफ्त) से गुजरने की आवश्यकता नहीं होगी , हटाएँ, या कुछ और)।
अत्यधिक सट्टा:
यदि .NET उसी वीएम पर एक से अधिक .NET ऐप के साथ वर्चुअल मशीन के रूप में चलता है, तो .NET उस मेमोरी पर पकड़ बना सकता है जो अभी तक GCd नहीं है, जब तक कि वह GC को नहीं चलाती है, और Windows को लगता है कि .NET है यह वास्तव में है की तुलना में अधिक का उपयोग करना। (और यदि MS वास्तव में स्लीक था, तो Windows तब .NET को जीसी को तंग मेमोरी स्थितियों में बता सकता था, लेकिन इसका कोई मतलब नहीं है क्योंकि डिस्क स्वैप स्पेस इसके लिए है।)
अगर .NET ने इस तरह से काम किया है, तो OS अभी भी इसे OS उद्देश्यों के लिए एक प्रक्रिया के रूप में सोचेगा, जो यह तय करने की जिम्मेदारी लेता है कि क्या रखना है और क्या फेंकना है, और यह सामान्य रूप से विंडोज की समस्या नहीं है कि वह एक प्रक्रिया बताए जिसकी उसे आवश्यकता है मैमोरी डीलिंग शुरू करने के लिए। किस बिंदु पर यह अनुमान योग्य है कि MS .NET के लिए एक विशेष API का निर्माण करेगा ताकि .NET प्रक्रियाएँ Windows प्रक्रियाओं की तरह दिखें, सिवाय इसके कि वे नहीं हैं, यही वजह है कि लोग सोच सकते हैं कि प्रक्रिया मेमोरी डीलॉक्लेट नहीं हो रही थी। यह वाकई; यह सिर्फ इतना है कि आप गलत प्रक्रिया को देख रहे हैं।
मैं .NET के बारे में पर्याप्त नहीं जानता कि यह वास्तव में उस तरह से काम करता है; जावा वीएम निश्चित रूप से नहीं करता है।
अटकलों का अंत।
संपादित करें: स्मृति प्रबंधन के लिए खराब होने वाली प्रक्रिया को मारने के रूप में इन्सोफ़र का संबंध है, कि एक ही पूल से बाहर आवंटित करने के लिए कई प्रक्रियाओं की आवश्यकता होती है (अर्थात वे वास्तविक प्रक्रियाओं की तुलना में धागे की तरह अधिक हैं) और प्रक्रिया के बाद मेमोरी को मुक्त नहीं किया जाना है। मारे गए। यह लगभग एक सहकारी मल्टीटास्किंग प्रणाली की आवश्यकता होगी, क्योंकि आभासी स्मृति और पूर्व-खाली मल्टीटास्किंग, मेरे ज्ञान के लिए, आमतौर पर एक साथ लागू किया गया था (वीएम एक दूसरे से प्रक्रियाओं को अलग करना और उन्हें एक-दूसरे की मेमोरी पर रोकना संभव बनाता है)। वर्चुअल मेमोरी होने के बाद यह ओएस स्तर पर एक प्रक्रिया के बाद साफ करने के लिए तुच्छ बनाता है; आप प्रक्रिया के पूल से सभी पूलों को मुफ्त पूल में ले जाते हैं।