2008-12-23 8 views
10

के मेमोरी उपयोग को कम करने के लिए कैसे करें मैं WPF का उपयोग करके सी # में लिखे गए एक छोटे बुकमार्क प्रबंधन ऐप पर काम कर रहा हूं। यह सिर्फ सिस्टम ट्रे में बैठता है और 99% समय निष्क्रिय है। हाल ही में मैंने टास्क मैनेजर में देखा और पाया कि यह लगभग 25 मेगाहर्ट्ज मेमोरी का उपयोग करता है (और पहली बार इसे सक्रिय करने से पहले लगभग 12 मेग्स) जो मैंने सोचा था कि एक ऐप के लिए थोड़ा अधिक था जो ज्यादातर समय नहीं करता था। इससे मुझे आश्चर्य हुआ कि स्मृति उपयोग को कम करने के कोई तरीके हैं, उदाहरण के लिए, वैकल्पिक रूप से WPF सुविधाओं को अक्षम करना।एक WPF ऐप

मैंने एक तथ्य खोजा है जो कुछ ले सकता है, हालांकि मुझे इसका लाभ उठाने का कोई तरीका नहीं पता है। .NET में थ्रेड प्रत्येक के करीब एक मेग लेते हैं, और यह पता चला है कि मेरा ऐप 6/12 धागे (पहली बार सक्रिय होने से पहले और बाद में) का उपयोग करता है। यह मेरे आधे मेमोरी उपयोग के लिए जिम्मेदार है जो महत्वपूर्ण है। मैं सीधे किसी भी नए धागे को नहीं खींचता, लेकिन मुझे नहीं पता कि डब्ल्यूपीएफ, साथ ही साथ .NET के अन्य हिस्सों में विभिन्न कार्यों के लिए थ्रेड का उपयोग किया जाता है, इसलिए मुझे इसके बारे में कुछ भी करना मुश्किल लगता है। उन चीजों के लिए ईवेंट का उपयोग करना जो सीधे जीयूआई से संबंधित नहीं हैं, उदाहरण के लिए यह नए धागे को जन्म देता है?

तो मुझे लगता है कि मेरा प्रश्न दो गुना है, आप स्मृति उपयोग को कैसे कम कर सकते हैं .NET/WPF अनुप्रयोग सामान्य रूप से और आप कैसे थ्रेड की संख्या को कम कर सकते हैं? ध्यान दें कि मैं this answer में लाए गए छोटे विवरणों के बारे में बहुत कुछ नहीं सोच रहा हूं, बल्कि अपने पूरे एप्लिकेशन में कम मेमोरी उपयोग के लिए डिज़ाइन कैसे करें।

उत्तर

5

दुर्भाग्यवश, मेरे अनुभव में, मैंने कम से कम विंडोज XP पर छोटे WPF ऐप्स के लिए 25MBMB देखा है। मुझे लगता है कि खाली टेम्पलेट WPF ऐप्स ~ 20MB लेते हैं। आप किस ओएस पर चल रहे हैं?

विंडोज विस्टा एक बेहतर कहानी है, और आप शायद एक खाली टेम्पलेट WPF ऐप के लिए ~ 13-15MB देखने की उम्मीद कर सकते हैं।

आपके ऐप के लिए 6-12 धागे का उपयोग करने के लिए और केवल ~ 25 एमबी का उपयोग करने के लिए, मैं कहूंगा कि आप बहुत अच्छी तरह से कर रहे हैं। :-)

+1

मैं Vista 64-बिट चला रहा हूं। ईमानदार होने के लिए, यह वास्तव में ऐसा कुछ नहीं है जिसे मैं बहुत ज्यादा चिंता करता हूं। मेरा मतलब है, मौजूदा हार्डवेयर कीमतों के साथ, स्मृति व्यावहारिक रूप से मुक्त है - 2 जीबी मेमोरी स्टिक के साथ मेरे प्रोग्राम की प्रत्येक प्रति को बंडल करना लगभग संभव है;) –

+0

यदि आप इसे टर्मिनल सेवाओं पर अनुकूलित करने के लिए कहा जाता है, तो आप इसके बारे में चिंता करेंगे, सर्वर व्यवस्थापक डॉन 30 निष्क्रिय प्रक्रियाओं को लगभग 1 जीबी रैम बर्बाद नहीं करना चाहते हैं। –

+0

आप भी चिंता करेंगे जब कई अन्य समान ऐप्स चल रहे हैं, प्रत्येक व्यक्ति बहुत सारी रैम का उपयोग कर रहा है। इसकी सड़कों की तरह, और सड़कों का निर्माण करें और आप बस अधिक भीड़ के साथ खत्म हो जाते हैं, अधिक रैम खरीदते हैं और आपको लगता है कि आपके बॉक्स को अभी भी और अधिक चाहिए। – gbjbaanb

5

यदि यह सिस्टम ट्रे ऐप है, तो आपके पास WinForms (या यहां तक ​​कि C++) में लागू प्रोग्राम का वह हिस्सा हो सकता है, और जब उपयोगकर्ता आपके आइकन को डबल-क्लिक करता है तो केवल WPF एप्लिकेशन को जन्म देता है। इस तरह, जब आप वास्तव में इसका उपयोग कर रहे हों तो आप केवल स्मृति के लिए भुगतान करते हैं।

1

यह सुनिश्चित नहीं करता कि यह मदद करता है, लेकिन एमएस विजुअल सी ++ में, डिफ़ॉल्ट स्टैक आकार 1 एमबी है, और जो भी आप संकलक विकल्प का उपयोग करना चाहते हैं उसे सेट किया जा सकता है। जाहिर है, सी # ऐप्स ने इस डिफ़ॉल्ट आकार को विरासत में मिला (इसलिए प्रत्येक थ्रेड कम से कम 1 एमबी लेता है)। लेकिन जब मैं "सीएससी /?" करता हूं तो इसे सेट करने के लिए वैसे भी ऐसा प्रतीत नहीं होता है

0

यह .NET/जावा अनुप्रयोगों का एक तथ्य है कि सीएलआर/जेवीएम allocate a larger heap memory then actually needed/used होगा। वे आमतौर पर ओएस को आवंटित करने के लिए तैयार नहीं हैं जब तक कि ओएस को भौतिक स्मृति स्टारवेलिंग नहीं मिल रहा हो।

लेकिन यह सच है कि memory-management is a difficult topic। समस्या यह है कि आप अपने आवेदन द्वारा memory usage को कैसे परिभाषित करते हैं? कुल आवंटित वर्चुअल मेमोरी? कुल कामकाजी सेट? निजी कामकाजी सेट? ढेर में इस्तेमाल स्मृति? ढेर आवंटित? न्यूनतम, चोटी या औसत?

एक चीज जो आप कर सकते हैं CLR Profiler का उपयोग करके जांच करने के लिए बहुत अधिक ढेर हैं। आप ढेर चमक को रोकने के लिए कई बार मेमोरी खपत खर्च करके इसे अनुकूलित करने का प्रयास कर सकते हैं।