2009-06-01 20 views
26

आवंटित कर सकती है कचरा कलेक्टर अधिकतम .NET प्रक्रिया के लिए आवंटित कर सकता है? जब मैं x64 को संकलित करता हूं, Process.GetCurrentProcess.MaxWorkingSet लगभग 1,4GB लौटाता है, लेकिन जब मैं AnyCPU (x64) को संकलित करता हूं तो वही संख्या वापस आती है। X64 के लिए यह कार्य प्रबंधक में प्रदर्शित "सीमा" मान की तरह होना चाहिए। मैं सही संख्या कैसे प्राप्त कर सकता हूं जो आउटऑफमेमरी-अपवादों का कारण बनता है जब सभी मामलों में पार हो जाता है?अधिकतम मेमोरी एक .NET प्रक्रिया

कुछ उदाहरण क्या विधि लौटना चाहिए:

1) मशीन विन्यास: 64-विंडोज, 4GB भौतिक स्मृति, 4GB पृष्ठ फ़ाइल
-As 64-बिट प्रक्रिया: 8GB
-As 32-बिट प्रक्रिया : 1.4GB

2) मशीन विन्यास: 64-विंडोज, 1GB भौतिक स्मृति, 2GB पृष्ठ फ़ाइल
-As 64-बिट प्रक्रिया: 3GB
-As 32-बिट प्रक्रिया: 1.4GB

3) मशीन विन्यास: x32-विंडोज, 4GB भौतिक स्मृति, 4GB पृष्ठ फ़ाइल
-As 64-बिट प्रक्रिया:
-As 32-बिट प्रक्रिया ऐसा नहीं होगा: 1.4GB

4) मशीन विन्यास: x32-विंडोज, 512MB भौतिक स्मृति, 512MB पृष्ठ फ़ाइल
-As 64-बिट प्रक्रिया: 1.0GB

+0

सैद्धांतिक अधिकतम सीमाओं और श्रेणियों के बारे में बात करने में एक दिलचस्प पोस्ट है जिसमें एक .NET प्रक्रिया मेमोरी अपवादों से बाहर निकलना शुरू हो जाएगी: http://blogs.msdn.com/b/ टॉम/संग्रह/2008/04/10/चैट-प्रश्न-मेमोरी-सीमा-32-बिट-और -64-बिट-प्रक्रियाओं के लिए .aspx –

उत्तर

3

यह आप कितना रैम है पर निर्भर नहीं करता:
-As 32-बिट प्रक्रिया ऐसा नहीं करेंगे ?

सिद्धांत रूप में, एक x64 प्रक्रिया रैम के ईबी (एटाबाइट्स) आवंटित कर सकती है, मुझे लगता है - यानी, बहुत कम। लेकिन अगर आप करते हैं, तो आपकी मशीन को पागल की तरह पेजिंग शुरू करनी चाहिए और आम तौर पर मरना चाहिए।

यह 32 बिट मोड में अलग था, क्योंकि आप विंडोज़ में किसी भी प्रक्रिया में 1 जीबी से अधिक रैम आवंटित नहीं कर सके (हाँ, इसके आसपास के तरीके हैं, लेकिन यह सुंदर नहीं है)। व्यावहारिक रूप से, यह प्रति .NET प्रक्रिया के बारे में 7-800 मेगाहर्ट्ज का उल्लेख करता है, क्योंकि .NET ने कुछ स्थान आरक्षित किया है।

किसी भी तरह से, 32 बिट में, आप जितना अधिक उपयोग कर सकते हैं 3 जीबी है - ओएस अपने लिए 1 जीबी वर्चुअल स्पेस सुरक्षित रखता है।

64 बिट में, यह 2^64 होना चाहिए, जो एक बड़ी संख्या है, लेकिन http://en.wikipedia.org/wiki/X86-64 का कहना है कि यह 256TB वर्चुअल स्पेस और रीयल रैम का 1TB है। किसी भी तरह से, यह आपकी मशीन में होने की संभावना से कहीं अधिक है, इसलिए यह पृष्ठ फ़ाइल को हिट करने जा रहा है।

64-बिट ओएस और एक 64-बिट क्रम के साथ

, .NET 2.0 आधारित अनुप्रयोगों अब इस तरह के सर्वर आधारित कैश के रूप में डेटा के लिए 500 गुना अधिक स्मृति का उपयोग कर सकते हैं।

यह, BTW कुछ अच्छी जानकारी भी http://www.theserverside.net/tt/articles/showarticle.tss?id=NET2BMNov64Bit

है अगर आप एक x64 मशीन (यानी, 64 मशीन + 64 ओएस) पर कर रहे हैं, AnyCPU और 64 के लिए संकलन करता है एक ही बात - यह में चलता है एक्स 64 मोड।

  • 64 ओएस/नेट, AnyCpu: 64 एप्लिकेशन
  • 64 ओएस/फर्क सिर्फ इतना है अगर आप का उपयोग AnyCPU वीआरएस 86 है।नेट, 64: 64 एप्लिकेशन
  • 64 ओएस/नेट, x32: x32 एप्लिकेशन (64 नेट ढांचे के रूप में Fx के दोनों x32 और x64 संस्करण स्थापित)

  • x32 ओएस/नेट, AnyCPU: x32 एप्लिकेशन

  • x32 ओएस/.NET, x64: क्रैश और बर्न बाबी! (वास्तव में, यह सिर्फ कृपा से मर जाता है)
  • x32 ओएस/.NET, x32: x32 ऐप।
+0

लेकिन मैं मशीन के लिए वास्तविक मेमोरी सीमा कैसे प्राप्त कर सकता हूं? – Rauhotz

+0

मैं आपके उत्तर को खराब के रूप में चिह्नित करता हूं क्योंकि आपने सबकुछ मिश्रित किया है। 3 गीगा मेमोरी अधिकतम मुफ्त भौतिक स्मृति है जहां 1 या अधिक प्रक्रिया रह सकती है। कोई भी प्रक्रिया पूर्ण 4 गीगा स्पेस (32 बिट्स एड्रेसिंग) तक पहुंच सकती है, जो मेमोरी भौतिक मेमोरी में नहीं हो सकती है, कैश किया जाएगा (यदि कैश ठीक से सेटअप हो)। और 3 गीगा पूरी तरह से सच नहीं है। आपको एक्सपी के लिए एक्सपी सेट करना होगा, डिफ़ॉल्ट रूप से यह ऐप के लिए अधिकतम 2 गीगा रैम और ओएस (भौतिक मेमोरी) के लिए 2 गीगा है। –

+2

क्षमा करें, एरिक, लेकिन आपको इसे पढ़ने की ज़रूरत है, और वास्तव में इसे आजमाएं। 32 बिट सिस्टम पर सैद्धांतिक सीमा 4 जीबी हो सकती है, लेकिन खिड़कियां आपको 3 जीबी तक सीमित करती हैं (अन्य जीबी सिस्टम के लिए प्रयोग की जाती है, और बूट बूटम में आपको 3 जीबी का उपयोग करना पड़ता है), और प्रत्येक प्रक्रिया में एक 4 जीबी स्पेस, विंडोज़ या .NET FX उन प्रक्रियाओं के लिए 1 जीबी सीमा लागू करता है जो विशेष चीजें नहीं करते हैं (एसक्यूएल और एक्सचेंज करते हैं)। –

17

विंडोज़ मांग पर अधिक पेज फ़ाइल स्थान आवंटित करने के लिए कॉन्फ़िगर किया जा सकता है, या on request
Job objects स्मृति की एक निश्चित मात्रा से अधिक खपत को रोक सकता है।
ढेर और यह पीढ़ीगत प्रकृति (प्लस बड़े ऑब्जेक्ट में बड़े सामान डाल करने के लिए ढेर की जरूरत)

के विखंडन इन सभी का मतलब है कि हार्ड सीमा वास्तविकता में बहुत उपयोग नहीं है और सवाल का जवाब देने का अर्थ है "कैसे मैं बहुत सैद्धांतिक रूप से आवंटित कर सकता हूं "आपके विचार से कहीं अधिक जटिल है।

चूंकि यह जटिल किसी पूछ उस सवाल का शायद कुछ गलत करने के लिए कोशिश कर रहा है और अधिक उपयोगी कुछ करने के लिए अपने सवाल रीडायरेक्ट करना चाहिए है।

आप ऐसा करने की कोशिश कर रहे हैं जो इस तरह के प्रश्न की आवश्यकता होगी?

"मैं सिर्फ इतना पता करने के लिए जब प्रक्रिया की वर्तमान स्मृति लोड समस्याग्रस्त तो मैं एक कस्टम कैश में से कुछ वस्तुओं को मुक्त कराने की तरह कार्रवाई कर सकते हैं मिल सकता है चाहता हूँ।"

दाएं। यह एक सवाल अधिक ट्रैक्टेबल है।

जटिलता के क्रम में

दो समाधान:

  1. अपने कैश का उपयोग WeakReferences
    • इसका मतलब है कि चीजें आप के लिए लगभग जादुई प्रणाली द्वारा मुक्त हो जाएगा बनाओ लेकिन आप की तरह बातों पर थोड़ा नियंत्रण होगा प्रतिस्थापन नीति
    • इस कुंजी और एक कमजोर संदर्भ की भूमि के ऊपर से काफी बड़ा किया जा रहा है कैश की गई डेटा पर भरोसा करता
  2. notification of Garbage Collections
    • के लिए पंजीकरण करें यह आपको चीजों को मुक्त करने पर नियंत्रण करने देता है।
    • आप जीसी पीढ़ियों के लिए उचित अधिकतम आकार वाले सिस्टम पर भरोसा करते हैं जिसमें एक स्थिर स्थिति में कुछ समय लग सकता है।

अंक नोट करने के लिए। क्या यह है डेटा को पुन: गणना/पुन: अनुरोध करने के लिए इस विशाल कैश को बनाए रखने के लिए कम महंगा (इसकी आवाज़ से डिस्क पर जा रहा है)।
यदि आपका कैश आमतौर पर/लगातार अनुरोधित वस्तुओं के बीच खराब इलाके का प्रदर्शन करता है तो पेजिंग डेटा को और बाहर करने में काफी प्रयास किए जाएंगे। एक प्रभावी ट्यूनेड रीपेस्पेमेंट पॉलिसी वाला एक छोटा कैश काफी बेहतर प्रदर्शन करने का अच्छा मौका है (और अन्य चल रहे प्रोग्रामों पर बहुत कम प्रभाव के साथ)

एक तरफ के रूप में: .Net में, कोई परिवर्तनीय आकार वाली वस्तु (तार, सरणी) नहीं हो सकती स्मृति प्रबंधन के लिए कोर सीएलआर संरचनाओं की सीमाओं के कारण आकार में 2 जीबी से अधिक हो। (और ऊपर दिए गए समाधान से इसका फायदा होगा)

+0

मैं सिर्फ यह जानना चाहता हूं कि प्रक्रिया का वर्तमान मेमोरी लोड समस्याग्रस्त हो सकता है, इसलिए मैं कस्टम कैश के कुछ आइटमों को मुक्त करने जैसे क्रियाएं कर सकता हूं। मूल्य को मेरे कैश के लिए सिर्फ एक संकेत, 100% सटीक होने की आवश्यकता नहीं है। वर्तमान में मेरे पास एक सीमा के रूप में मुफ्त भौतिक स्मृति की मात्रा है, लेकिन 32-बिट प्रक्रियाओं के लिए बाधा कम है। – Rauhotz

+0

बीटीडब्ल्यू: गतिशील पृष्ठ फ़ाइल आकार के साथ अच्छा बिंदु, इसे याद किया जाता है, लेकिन अभी के लिए, मैं वर्तमान सीमा से संतुष्ट होगा। – Rauhotz

+0

आहा - अब हम कहीं जा रहे हैं - उत्तर अब संपादन – ShuggyCoUk

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