2012-04-16 15 views
11

में वीक संदर्भों को मुक्त नहीं किया गया है मुझे यहां एक अजीब व्यवहार मिला है: मुझे एक डब्लूएलजी एप्लीकेशन चलाने वाले उत्पादन में भारी मेमोरी लीक मिलती है जो एक डीएलओजी-टर्मिनल (विंडोज एम्बेडेड स्टैंडर्ड एसपी 1) पर चलती है जो पूरी तरह से ठीक है मैं इसे सामान्य डेस्कटॉप पर लॉन्ली चलाता हूं (Win7 prof।)कमजोर ओएस

किसी भी समस्या को खोजने के कई असुरक्षित प्रयासों के बाद मैंने सीधे उन लोगों में से एक को अपने मॉनिटर के बगल में रखा, एएनटी मेमोरीप्रोफाइलर स्थापित किया और एक घंटे का टेस्ट रन दोनों पर उपयोगकर्ता संचालन अनुकरण किया टर्मिनल और मेरे विकास पीसी।

परिणाम यह है कि कुछ अजीब कारणों से एम्बेडेड सिस्टम वीक रेफरेंस और प्रभावी वाल्यूएन्ट्री [] ऑब्जेक्ट्स की एक बड़ी मात्रा को ढेर करता है।

विकास (पीसी): enter image description here

enter image description here

और टर्मिनल: enter image description here

बस कक्षा सूची देखो ...

यहाँ कुछ तस्वीरें हैं enter image description here

क्या किसी ने इससे पहले ऐसा कुछ देखा है और इसके समाधान ज्ञात हैं? मुझे सहायता कहाँ मिल सकती है?

(पी एस टर्मिनलों जहां .net4 के लिए तैयार छवियों के साथ स्थापित)

पी पी एस: बंद मतदाता के लिए: मुझे लगता है सवाल स्पष्ट है: मैं इसे ठीक कर सकते हैं। आप तर्क दे सकता है अगर यह एक आईटी/ओएस समस्या बनाम एक प्रोग्रामिंग समस्या है, लेकिन मुझे लगता है कि अगर मैं सर्वर में इस पोस्ट दोष यह कुछ ही समय में एक विषय से हटकर पास मिल जाएगा ...

अद्यतन: मैं समस्या का एक बड़ा हिस्सा खोजने में सक्षम था - लेकिन यह थोड़ा सा लगता है जैसे सी ++: मैं एक डब्ल्यूपीएफ-लिस्ट के लिए व्यूमोडेल-जैसी आइटम क्लास का उपयोग करता हूं जो आईसीओएमएंड (रिलेकॉमैंड-पैटर्न) प्रदान करता है। दृश्यों के लिए व्यूमोडेल-प्रॉपर्टी के गेटटर में फ्लाई पर बनाए गए आइटम और ऐसा लगता है कि एप्लिकेशन/जीसी ने उन अप्रयुक्त आदेशों को कभी भी मुक्त नहीं किया - या उनके CanExecuteChanged के लिए सब्सक्राइबशन - मेमोरी प्रोफाइलर उन्हें " कमजोर संदर्भ "। मैंने अपने कोड को उन आइटम-व्यूमोडल्स का पुन: उपयोग करने के लिए बदल दिया है और अपने निपटान में हर प्रयुक्त गुणों को रद्द/सेट करने के लिए सेट/सेट किया है और जैसा कि मैंने कहा है: उन पुराने C++ दिनों में "हटाएं" जैसा लगता है। इसके ऊपर मैं एक जबरन जीसी का उपयोग करता हूं। हर 30 मिनटों को चुनिए (हाँ मुझे पता है - आपको कभी नहीं करना चाहिए - लेकिन अब तक मुझे कोई अन्य समाधान नहीं मिला है)। इस सेटअप के साथ एप्लिकेशन अब तक समस्याओं के बिना 6+ घंटे तक चलता है लेकिन यह सही नहीं लगता है।

मैं नहीं समझ सकता क्यों उन WeakReferences के रूप में वे मेरे डेस्कटॉप मशीन पर कर रहे हैं दावा नहीं किया जाता ...

इस पर कोई विचार? कृप्या!

अद्यतन: मैं अभी भी इस समस्या को नीचे पिन करने में सक्षम नहीं हूँ, लेकिन मैं एक अजीब व्यवहार देखें: अगर मैं का उपयोग पीसी कहीं भी टर्मिनलों में से एक पर अपने सॉफ़्टवेयर के संचालन का निरीक्षण करने के समस्या दूर हो जाने! 8hr चलने के बाद भी।सीधा सॉफ़्टवेयर चलता है जैसा कि इसे करना चाहिए - यह भी मुफ्त मेमोरी (मैं मुख्य स्क्रीन में थोड़ा मेमोरी काउंटर-डिस्प्ले रखूंगा - मान लें कि मैं टर्मिनल से कनेक्ट हूं और देखता हूं कि मेमोरी कम है - कुछ मिनट प्रतीक्षा करने के बाद मेमोरी पुनः प्राप्त की जाती है)

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

इस पर कोई विचार?

+1

डीबग संलग्न किए बिना डीबीयूटी असेंबली के डीबग बिल्ड को चलाने के साथ यह ज्ञात समस्या है। यह कमजोर संदर्भों को रिसाव करता है जो संपादन + जारी रखने के समर्थन के साथ WithEvents घटनाओं का ट्रैक रखने के लिए स्वतः उत्पन्न होते हैं। इसके अलावा, स्क्रीन शॉट्स से इंजीनियर कोड को रिवर्स करना असंभव है। –

+1

पहला: यह न तो वीबीएनईटी कोड है (यह नहीं कि इससे कोई फर्क नहीं पड़ता) और न ही इसे डीबीयूजी सेट के साथ संकलित किया गया है - इसके ऊपर दोनों ही एक ही प्रोफाइलर के उसी संस्करण से शुरू किए गए डीबगर संलग्न किए बिना चलाए गए थे, लगभग उसी डेटा के साथ एक ही समय में एक ही असेंबली और फाइलें (एक्सकोपीड) - और आपको क्या लगता है कि आप डब्ल्यूपीएफ कोड की कई लाइनों को देख सकते हैं (या आप ** ** सभी ** कोड चाहते हैं - यह कुछ एमबी है टेक्स्ट-फाइल्स ... ओपन-सोर्स बीटीडब्लू नहीं) – Carsten

+0

समस्या के संदर्भ में @ हंसपैसेंट का उल्लेख है (हां, वीबी.नेट यहां मायने रखता है): http://support.microsoft.com/?kbid=919481 – roken

उत्तर

5

हमारे पास एक टैबलेट पर मेरा ऐप चलाने वाला एक (कुछ हद तक) समान समस्या थी। डेस्कटॉप पर चलने पर स्मृति को पुनः दावा किया जाएगा, लेकिन टैबलेट या किसी अन्य डिवाइस पर चलाने पर नहीं जब पीसी इनपुट पैनल का उपयोग किया जाता है। समस्या यह है कि अंतिमकरण कतार अटक जा रही थी। COM ऑब्जेक्ट फ़ाइनलाइज़र मुख्य थ्रेड पर कुछ चलाने का इंतजार कर रहा था, जिसमें संदेश लूप नहीं था।

समाधान Application.DoEvents() को आमंत्रित करने के लिए पर्याप्त समय ढूंढना था। हमारे पास एक विधि थी जिसे अंतःस्थापित कहा जाएगा और हम इसे हर 10 वीं कॉल के साथ बुलाते हैं। मुझे नहीं पता कि यह आपके जैसा ही मुद्दा है, लेकिन शायद यह कुछ प्रकाश डाल सकता है।

संपादित करें: मुझे इसे स्पष्ट करने की आवश्यकता है, सामान्यतः, DoEvents() पर कॉल करना एक बुरा विचार है। यह उस मामले में काम करता है क्योंकि उस धागे पर कोई यूआई नहीं है या कुछ भी हो रहा है कि ये घटनाएं हस्तक्षेप कर सकती हैं।

+0

की जांच कर रहा हूं - मैं इसे एक बार में देखूंगा! - बीटीडब्लू: सॉफ़्टवेयर को निष्क्रिय/बंद करना (?) कीबोर्ड समस्या को हल करता है? मुझे वास्तव में डिवाइस पर कीबोर्ड की आवश्यकता नहीं है। – Carsten

+0

यदि मुझे सही तरीके से याद है, तो कीबोर्ड इनपुट पैनल को अक्षम करना डीआईडी ​​समस्या को हल करता है, लेकिन मेरे पास अब डिवाइस नहीं है इसलिए मैं सत्यापित नहीं कर सकता। – Devin

+0

कुछ समय के लिए यह जांचने के बाद मुझे कहना है: नहीं, यह समस्या का समाधान नहीं करता है।मैंने इनपुट-पैनल सॉफ़्टवेयर को हटा दिया और WinForms-DoEvent और यहां तक ​​कि मैन्युअल WPF-Dispatcher invokation का उपयोग करने का प्रयास किया - लेकिन आपके टिप के लिए धन्यवाद - मुझे लगता है कि यह सही दिशा में इंगित करता है। – Carsten

2

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