2016-01-28 4 views
14

कई SO उत्तरों और this widely cited blog post के अनुसार, 'किसी भी CPU' के लिए बनाया गया एक .NET 4.5 एप्लिकेशन '32-बिट' विकल्प के साथ चयनित 32-बिट और 32-बिट सिस्टम दोनों पर 32-बिट प्रक्रिया के रूप में चलाया जाएगा (.NET 4.0 और इससे पहले के विपरीत)। दूसरे शब्दों में, x86 और AnyCPU 'पसंदीदा 32-बिट' के साथ चयनित समकक्ष हैं (यह अनदेखा कर रहा है कि यह एआरएम पर चल सकता है या नहीं)।'कोई भी CPU (32-बिट पसंद करते हैं)' मुझे x86 से .NET 4.5 के तहत अधिक मेमोरी आवंटित करने की अनुमति क्यों देता है?

हालांकि, मेरे परीक्षणों से पता चला है कि 64-बिट सिस्टम पर 'AnyCPU 32-बिट' पसंद करता है (जिसे मैं 32-बिट चलाता हूं) x86 एक से अधिक स्मृति आवंटित कर सकता है। मैंने एक .NET 4.5 सी # कंसोल ऐप लिखा है जो एक लूप में 10 एमबी बाइट एरे आवंटित करता है (कोर्स के संदर्भों को रखते हुए) जब तक कि यह आउटऑफमेमरी अपवाद को हिट नहीं करता है, और इसे 64-बिट सिस्टम पर बहुत सी रैम के साथ चलाया जाता है। जब x86 के रूप में बनाया गया यह लगभग 1.2 जीबी आवंटित होता है। 'सीपीयू (32-बिट पसंद करते हैं)' के रूप में बनाया गया एक ही कोड 1.5 जीबी तक पहुंच जाता है।

अंतर क्यों?

उत्तर

13

ऐसा लगता है कि, विजुअल स्टूडियो 2015 में, के रूप में निर्माण 'AnyCPU (पसंद करते हैं 32-बिट)', निष्पादन पर IMAGE_FILE_LARGE_ADDRESS_AWARE बिट (इस पर editbin /LARGEADDRESSAWARE चल के बराबर) सेट, जबकि यह एक x86 निर्माण के लिए नहीं करता है। इसकी पुष्टि dumpbin /HEADERS के साथ की जा सकती है और लाइन की तलाश है "एप्लिकेशन बड़े (> 2 जीबी) पते को संभाल सकता है"।

यह विजुअल स्टूडियो 2013 का मामला नहीं है। परिवर्तन apparently undocumented है।

सिद्धांत रूप में, यह सीएलआर को अतिरिक्त 2 जीबी खेलने के लिए देना चाहिए। मुझे नहीं पता कि आवंटित स्मृति केवल 300 एमबी तक क्यों बढ़ती है।

+1

मान लें कि आप 10 एमबी ऑब्जेक्ट्स को किसी सरणी में सूचीबद्ध कर रहे हैं या स्वयं सूचीबद्ध हैं, तो आप * * * सरणी उड़ रहे हैं। http://bhrnjica.net/2012/07/22/with-net-4-5-10-years-memory-limit-of-2-gb-is-over/ सेट 'gcAllowVeryLargeObjects' और कोशिश करें। मेरा अनुमान है कि आप अपनी आंतरिक सरणी का आकार बदलकर 'सूची' को ट्रिगर करते हैं और "ओओएम" –

+0

@ChrisMarisic में बदलते हैं, मैं प्रत्येक पुनरावृत्ति में एक नया 10 एमबी बाइट सरणी बना रहा हूं, और एक सूची में * संदर्भ * जोड़ रहा हूं (उन्हें रोकने के लिए कचरा इकट्ठा किया जा रहा है)। तो सूची स्वयं छोटा है, केवल कुछ सौ संदर्भ। –

संबंधित मुद्दे