के साथ एक अप्रबंधित डीएल से निपटने के लिए मेरे पास एक सी # एप्लिकेशन है जो कुछ हार्डवेयर तक पहुंचने के लिए किसी तृतीय-पक्ष अप्रबंधित असेंबली पर निर्भर करता है।मेमोरी लीक
अप्रबंधित कोड में एक स्मृति रिसाव है जो प्रत्येक पहुंच के बाद ~ 10 एमबी द्वारा स्मृति खपत में वृद्धि करेगा। समस्या ज्ञात है; कोई बगफिक्स उपलब्ध नहीं है।
क्या कोई तरीका है कि मैं नियमित रूप से पुनरारंभ किए बिना इस असेंबली का उपयोग जारी रख सकता हूं?
मैंने एक अलग ऐपडोमेन बनाने की कोशिश की, उस ऐपडोमेन में अपमानजनक कोड appDomain.CreateInstanceAndUnwrap()
के माध्यम से लोड करें और बाद में AppDomain.Unload()
के माध्यम से डोमेन को उतार दिया। हालांकि यह स्पष्ट रूप से उस डोमेन द्वारा उपयोग की गई अप्रबंधित स्मृति को मुक्त नहीं करता है, केवल प्रबंधित स्मृति।
मैं एप्लिकेशन को दो स्वतंत्र भागों में भी विभाजित कर सकता हूं, और केवल अप्रबंधित डीएल के साथ भाग को पुनरारंभ कर सकता हूं। हालांकि इसका मतलब एक नया रीडिज़ाइन होगा, और संभवतः बहुत मंदी का कारण बनता है, क्योंकि इन दो हिस्सों के बीच बड़ी मात्रा में डेटा का आदान-प्रदान किया जाना चाहिए।
क्या इस रिसाव असेंबली को कम करने का एक और तरीका है और इसे फिर से शुरू किए बिना अपनी याददाश्त जारी करने के लिए मजबूर करें।
जब तक आप डेटा संरचनाओं में जबरन खुदाई नहीं कर सकते हैं, डीएलएल का उपयोग करता है, और मैन्युअल रूप से स्मृति को मुक्त कर देता है, तो नहीं। अलग प्रक्रिया आप कर सकते हैं सबसे अच्छा है। यह आपके प्रश्न में पूरी तरह से स्पष्ट नहीं था, लेकिन थोड़ी देर के लिए एक अलग प्रक्रिया जिंदा है, जब तक कि यह "बहुत बड़ा" बन गया हो (जब भी आप चुनते हैं मानक), और फिर एक नया कताई न हो, तो आपके पास एकाधिक अनुरोधों को संभालना नहीं होगा * वह * बहुत मंदी, लेकिन कुछ, हाँ। उदाहरण के लिए आप एक नया स्पिन कर सकते हैं और पुराना एक पंपिंग अनुरोध जारी रख सकते हैं जब तक कि नया डाउनटाइम से बचने के लिए तैयार नहीं हो जाता। –
@ LasseV.Karlsen - एक उत्तर के रूप में conisder कॉपी पेस्ट। मुझे यहां कुछ और नहीं कहना है। –
मुझे लगता है कि एप्लिकेशन को विभाजित करने के लिए आपकी सबसे अच्छी शर्त है। बड़ी मात्रा में डेटा को स्थानांतरित करने के लिए साझा स्मृति का उपयोग करके आप कुछ मंदी से बच सकते हैं। लाइब्रेरी के लिए 'malloc'/'free' (या' new' /' delete') को हुक करना और DLL के लिए अपना स्वयं का अलग ढेर लागू करना एक विकल्प होगा। इस पर निर्भर करता है कि क्या डीएलएल गतिशील सी/सी ++ रनटाइम या स्थैतिक एक का उपयोग करता है, यह बेहद जटिल से निराशाजनक रूप से जटिल हो जाएगा। –