2013-07-18 5 views
8

मेरे VB.Net अनुप्रयोगों में से एक में मुझे एप्लिकेशन चलाने के दौरान त्रुटि मिल रही है। यह त्रुटि हमेशा नहीं आती है। इसलिए मैं भी त्रुटि को पुन: उत्पन्न करने में सक्षम नहीं हूं। त्रुटि को पुन: उत्पन्न करने के लिए कोई सटीक अनुक्रम भी नहीं है।एक vb.net अनुप्रयोग के लिए OutOfMemoryException

ढेर: System.OutOfMemoryException: स्मृति से बाहर। System.Drawing.Graphics.FromHdcInternal (IntPtr hdc) पर System.Windows.Forms.ToolStrip.OnPaint (PaintEventArgs ई) System.Windows.Forms.Control.PaintWithErrorHandling पर (PaintEventArgs ई, int16 परत, बूलियन disposeEventArgs) पर System.Windows.Forms.Control.WmPaint (संदेश & मी) System.Windows.Forms.Control.WndProc पर (संदेश & मी) System.Windows.Forms.ScrollableControl.WndProc पर (संदेश & मी) सिस्टम पर पर .Windows.Forms.ToolStrip.WndProc (संदेश & मीटर) System.Windows.Forms.StatusStrip.WndProc (संदेश & मीटर) System.Windows.Forms.Control.ControlNativeWind पर ow.OnMessage (संदेश & मी) System.Windows.Forms.Control.ControlNativeWindow.WndProc (संदेश & मी) पर System.Windows.Forms.NativeWindow.Callback पर (IntPtr hWnd, Int32 संदेश, IntPtr wParam, IntPtr lParam)

त्रुटि विवरण:

MyApplication_UnhandledException

इस त्रुटि के बाद मैं प्राप्त एक संदेश कह रही,

0,123,

बिटमैप बनाने के लिए अपर्याप्त स्मृति। उपलब्ध बढ़ाने के लिए एक या अधिक एप्लिकेशन बंद करें।

जब मैंने एप्लिकेशन के मेमोरी उपयोग की जांच की तो यह उच्च नहीं था। यह त्रुटि बार-बार दिखाई नहीं देती है। तो मैं इस त्रुटि का निवारण कैसे कर सकता हूं। इसे कैसे हल किया जा सकता है? मैंने नेट मेमोरी प्रोफाइलर और रीडगेट मेमोरी प्रोफाइलर का उपयोग कर अपने एप्लिकेशन को चलाने की जांच की।

नीचे अप्रबंधित स्मृति उपयोग की मात्रा का एक स्क्रीनशॉट है। मैं ठीक से नहीं जानता कि ये मान उच्च हैं या नहीं।

अद्यतन:

मैं त्रुटि GDI वस्तुओं again.checked मिला है और यह 9998.So त्रुटि उच्च GDI की वजह से था था objects.Now सवाल यह है कि solve.Then है मैंने GDIView का उपयोग किया और चेक किया। उस उपकरण से मुझे पेन -2954 ब्रश -5 9 18 फ़ॉन्ट-9 0 बिटमैप -13 आदि मिला जीडीआई कुल 99 99 तो कलम और ब्रश क्या हैं? मेरे कोड में मेरे पास ब्रश या कलम नहीं है। (मैंने 'कलम' और 'ब्रश' के लिए कोड खोजा लेकिन उसे कोई भी नहीं मिला।) तो कृपया मुझे

+0

टूलटिप को आप क्या निर्दिष्ट करते हैं? – Tigran

+1

क्या आप अपना कोड दिखा सकते हैं, कृपया? अधिमानतः कुछ हिस्सा जो बिटमैप्स के साथ काम करता है? – Ryan

+1

एकमात्र चीज जो स्पष्ट है कि आप ActiveX नियंत्रणों का उपयोग बहुत अधिक करते हैं। जो कचरा कलेक्टर को अक्सर परेशानी से दूर रखने के लिए पर्याप्त रूप से चलने से रोक सकता है। जब आप अपने सिस्टम पर निपटान() का उपयोग नहीं करते हैं तो आपको किस तरह की परेशानी होती है। ऑब्जेक्ट्स ड्रॉइंग। जब आप बहुत अधिक हैंडल का इस्तेमाल करते हैं तो यह इस तरह बम करता है। –

उत्तर

8

पर अपने कार्य प्रबंधक पर मेरी सहायता करें पर जाएं मेनू प्रक्रियाओं को प्रदर्शित करने के लिए टैब पर कौन से कॉलम दिखाना है, यह देखने के लिए देखें। चुनें कि आप जीडीआई ऑब्जेक्ट्स कॉलम दिखाना चाहते हैं।मैं काफी हद तक निश्चित हूं कि आप देखेंगे कि आपकी प्रक्रिया के लिए कुल जीडीआई ऑब्जेक्ट 10000 तक पहुंच रहा है, जो कि किसी भी प्रक्रिया के लिए अधिकतम है।

यह कोई फर्क नहीं पड़ता कि कितनी भौतिक स्मृति का उपयोग किया जा रहा है। उस अर्थ में, त्रुटि संदेश बहुत खराब और भ्रामक है। समस्या यह है कि आप जीडीआई हैंडल से बाहर हो गए हैं। विंडोज़ के तहत प्रत्येक प्रक्रिया जीडीआई हैंडल की अधिकतम संख्या तक सीमित है जो वे बना सकते हैं। वर्तमान में सीमा प्रति प्रक्रिया 10000 हैंडल है।

कारण मुझे लगता है कि आपकी समस्या जीडीआई हैंडल है क्योंकि अपवाद को फेंकने की प्रक्रिया के दौरान एक नया बिटमैप बनाने की कोशिश कर रहा है। एक बिटमैप एक जीडीआई वस्तु है। बिटमैप बनाना उस बिटमैप के लिए एक जीडीआई हैंडल का उपयोग करता है। इसलिए, यह संभवतः कारण है।

चूंकि मानक ToolStrip नियंत्रण में त्रुटि हो रही है, तो ToolStrip के साथ यह एक बग होने की संभावना नहीं है। यह आपके कंप्यूटर में कहीं और है, सभी जीडीआई हैंडल का उपयोग करके, और फिर, जब नियंत्रण स्वयं को पेंट करने की कोशिश करता है, तो यह विफल रहता है क्योंकि कोई हैंडल नहीं छोड़ा जाता है।

जब भी आप पेन और बिटमैप्स जैसे जीडीआई ऑब्जेक्ट्स बना रहे हैं, तो आपको यह सुनिश्चित करना होगा कि आप उन ऑब्जेक्ट्स का निपटान करें। जीडीआई हैंडल हासिल करने वाले सभी जीडीआई वर्ग IDisposable इंटरफ़ेस को कार्यान्वित करते हैं। जब वस्तुओं का निपटारा किया जाता है, तो वे उस बिंदु पर स्वचालित रूप से अपने हैंडल हटा देते हैं। लेकिन, यदि आप वस्तुओं का कभी निपटान नहीं करते हैं, तो हैंडल कभी नहीं हटाए जाते हैं और आपकी जीडीआई-ऑब्जेक्ट गिनती बढ़ती रहती है। और भी बेहतर के लिए चर घोषित करने के लिए

Dim b As New Bitmap("test.bmp") 
'... 
b.Dispose() 

लेकिन अगर आप कर सकते हैं, यह है:

किसी भी IDisposable वस्तु के निपटान के लिए, आप बस Dispose विधि, कॉल कर सकते हैं जब आप वस्तु के साथ किया जाता है, उदाहरण के लिए एक Using ब्लॉक के साथ IDisposable वस्तुओं, इस तरह:

Using b As New Bitmap("test.bmp") 
    '... 
End Using 

Using ब्लॉक के साथ, Dispose विधि आपके लिए स्वचालित रूप से बुलाया जाएगा, इसलिए आपको इसे स्वयं स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है। Using ब्लॉक Dispose पर कॉल करने से बेहतर है क्योंकि Using ब्लॉक के अंदर एक अपवाद फेंक दिया गया है, तो Dispose विधि अभी भी स्वचालित रूप से कॉल की जाएगी। यदि आप इसे Using ब्लॉक के बिना स्पष्ट रूप से स्वयं कॉल कर रहे हैं, तो इसे कॉल करने के लिए आपको हर जगह याद करना आसान है।

अपने कोड में समस्या क्षेत्र ढूंढने के लिए, अपने प्रोग्राम को डीबगर में चलाएं और अपने कोड के माध्यम से कदम उठाएं। कार्य प्रबंधक खुला, जीडीआई ऑब्जेक्ट्स कॉलम दिखा रहा है, जबकि आप अपने कोड से आगे बढ़ रहे हैं। जीडीआई ऑब्जेक्ट्सकॉलम प्रबंधक में कॉलम देखें और आप नई जीडीआई ऑब्जेक्ट्स के रूप में गिनती वृद्धि देखेंगे। यह समस्या देखने के लिए, यह समस्या कहां है, यह काफी आसान होना चाहिए।

+1

+1 जैसा कि कहा गया है, प्रयोग ब्लॉक आदर्श है। –

+0

यदि मुझे किसी भी पीसी में त्रुटि मिलती है तो मैं जीडीआई ऑब्जेक्ट की जांच करूंगा। –

+1

मेरे आवेदन में ग्रिड पर क्लिक करने के दौरान एमएसएफएक्सग्रीड डिस्पोजेक्ट नहीं कर रहा था। यह ग्रिड पर प्रत्येक क्लिक के लिए जीडीआई ऑब्जेक्ट बढ़ रहा था और समाधान मिला। तब मैंने डीबगर में प्रोग्राम चलाकर समस्या हल की। ​​अब समस्या हल हो गई है और अब जीडीआई गिनती रहती है 250 से 300. बहुत बहुत धन्यवाद। –