हां, प्रत्येक धागा अपने स्वयं के ढेर है। यह एक कठिन आवश्यकता है, स्टैक यह ट्रैक रखता है कि यह खत्म होने के बाद एक विधि कहां लौटाता है, यह रिटर्न पता स्टोर करता है। चूंकि प्रत्येक थ्रेड अपना कोड निष्पादित करता है, इसलिए उन्हें अपने स्वयं के ढेर की आवश्यकता होती है। स्थानीय चर और विधि तर्क भी वहां संग्रहित होते हैं, जिससे उन्हें (आमतौर पर) थ्रेड-सुरक्षित बना दिया जाता है।
ढेर की संख्या एक और अधिक शामिल विस्तार है। आप ढेर एकत्रित कचरे के लिए 1 गिन रहे हैं। यह कार्यान्वयन बिंदु से पूरी तरह से सही नहीं है, तीन पीढ़ी के ढेर प्लस बड़े ऑब्जेक्ट हीप तार्किक रूप से अलग ढेर हैं, जो कि चार तक जोड़ते हैं। जब आप बहुत अधिक आवंटित करते हैं तो यह कार्यान्वयन विवरण महत्वपूर्ण होता है।
एक और एक है कि आप पूरी तरह से प्रबंधित कोड में नजरअंदाज नहीं कर सकते ढेर कि स्थैतिक चर संग्रहीत करता है। यह ऐपडोमेन से जुड़ा हुआ है, जब तक ऐप्पडोमेन रहता है तब तक स्थैतिक चर रहते हैं। आम तौर पर नामित "लोडर ढेर" .NET साहित्य में। इसमें वास्तव में 3 ढेर होते हैं (उच्च आवृत्ति, कम आवृत्ति और स्टब ढेर), जिंद कोड और टाइप डेटा भी वहां संग्रहीत होता है लेकिन यह नटकिटी हो रहा है।
इसके अलावा उपेक्षा इस सूची में नीचे मूल कोड के द्वारा प्रयोग किया ढेर कर रहे हैं। उनमें से दो मार्शल वर्ग से आसानी से दिखाई दे रहे हैं। एक डिफ़ॉल्ट प्रक्रिया ढेर है, विंडोज़ इससे आवंटित है, तो मार्शल। AllocHGlobal() करता है। और वहां एक अलग ढेर है जहां COM डेटा स्टोर करता है, मार्शल। AllocCoTaskMem() इससे आवंटित करता है। आखिरकार आपके द्वारा इंटरपॉप किए जाने वाले किसी मूल कोड के रनटाइम समर्थन के लिए अपना ढेर होगा। उस तरह के कोड द्वारा उपयोग किए जाने वाले ढेर की संख्या केवल मूल डीएलएल की संख्या से घिरा हुआ है जो आपकी प्रक्रिया में लोड हो जाती है। इन सभी ढेर मौजूद हैं, आप मुश्किल से कभी उनके साथ सौदा करते हैं।
तो, न्यूनतम 10 ढेर।
स्रोत
2012-06-26 00:12:19
उत्कृष्ट लिंक के लिए धन्यवाद, वास्तव में अच्छा संसाधन है। – Richard