रिकॉर्ड के लिए, यह रेमंड चेन की श्रेणी को फिट करता है "अगर आपको पता होना चाहिए तो आप कुछ गलत कर रहे हैं"।
64-बिट कोड चलाने वाले थ्रेड के लिए डिफ़ॉल्ट स्टैक आकार 4 मेगाबाइट्स, 32-बिट कोड के लिए 1 मेगाबाइट है। जबकि थ्रेड कन्स्ट्रक्टर आपको int.MaxValue तक एक पूर्णांक मान पास करने देता है, आपको इसे 32-बिट मशीन पर कभी नहीं मिलेगा। स्टैक को वर्चुअल मेमोरी एड्रेस स्पेस में उपलब्ध छेद में फिट होना चाहिए, जो आम तौर पर प्रक्रिया जीवनकाल में ~ 600 एमबी पर ऊपर जाता है। जब आप मेमोरी आवंटित करते हैं और एड्रेस स्पेस को विभाजित करते हैं तो तेज़ी से छोटे हो जाते हैं।
डिफ़ॉल्ट से अधिक आवंटित करना काफी अनावश्यक है। आप इस पर विचार कर सकते हैं जब आपके पास भारी रिकर्सिव विधि है जो ढेर को उड़ाती है। नहीं, एल्गोरिदम को ठीक करें या जब भी नौकरी बड़ी हो जाए तो आप इसे उड़ा देंगे।
सबसे छोटा ढेर जो .NET आपको 250 KB चुनने देता है। यदि आप एक मान को छोटा करते हैं तो यह चुपचाप इसे गोल करता है। जरूरी है क्योंकि जिटर और कचरा कलेक्टर दोनों को अपना काम पूरा करने के लिए स्टैक स्पेस की आवश्यकता होती है। फिर, ऐसा करना काफी अनावश्यक होना चाहिए। यदि आप ऐसा करने पर विचार करते हैं क्योंकि आपके पास बहुत सारे धागे हैं और सभी स्टैच के साथ वर्चुअल मेमोरी का उपभोग करते हैं तो आपके पास बहुत सारे धागे हैं। एक StackOverflowException आप प्राप्त कर सकते हैं सबसे nastiest रनटाइम अपवादों में से एक है। प्रक्रिया मृत्यु तत्काल और अप्रत्याशित है।
मुख्य धागे के लिए स्टैक आकार EXE शीर्षलेख में एक विकल्प द्वारा निर्धारित किया जाता है। कंपाइलर में इसे बदलने का विकल्प नहीं है, आपको .exe शीर्षलेख को पैच करने के लिए editbin.exe/stack का उपयोग करना होगा।
स्रोत
2011-04-01 00:17:30
[विंडोज़ की सीमाओं को धक्का देना: प्रक्रियाएं और थ्रेड] (http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx) दिलचस्प हो सकता है। हालांकि यह सीधे सवाल का जवाब नहीं देता है। वास्तव में, –
। साझा करने के लिए धन्यवाद। – Oved