7

मैंने एंड्रॉइड में मेमोरी रिसाव के कारण को खोजने का प्रयास करने में लगभग पूरे दिन बिताया। एक ऐसी गतिविधि है जिसे मैं कई बार खोलता/बंद करता हूं (टाइमर के साथ)। थोड़ी देर के बाद मैं OutOfMemory त्रुटियों हो रही थी:स्मृति से बाहर होने से पहले Xamarin.Android में स्वचालित रूप से जीसी नहीं चलाया जाना चाहिए?

enter image description here

मुझे यकीन है कि बनाया वहाँ कोई गुण थे:

enter image description here

मैं स्मृति हर बार गतिविधि खोला Xamarin प्रोफाइलर में लगातार ऊपर जा रहा देखा या घटना हैंडलर जो उस गतिविधि में फंस सकते हैं। मैंने मेमोरी लीक का कारण बनने का पता लगाने की कोशिश कर, हर छवि, बटन इत्यादि को भी हटा दिया। अभी भी वही ...

तब मैंने GC.Collect()OnResume में मुख्य गतिविधि की विधि (जो समस्याग्रस्त गतिविधि खोलता है) में किया था। अब मैं इसे ऊपर और नीचे जाने वाली स्मृति को देख सकता हूं।

enter image description here

के अनुसार Xamarin docs:

जीसी जब नाबालिग ढेर नया आवंटन

के लिए स्मृति के समाप्त हो गया है चलेंगे आप स्क्रीनशॉट में परिणाम देख सकते हैं लेकिन वास्तव में यह नहीं हो रहा है

+3

प्रासंगिक पढ़ने: https://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/#Cross-VM_Object_Collections और http://stackoverflow.com/questions/ पर एक नजर डालें 28863058/xamarin-android-finalizer- नहीं-जाने-जाने-जाने-जाने-जाने-गतिविधि-टू-गो-टू/28868582 # 28868582 – matthewrdev

उत्तर

9

आप अपने लिंक में थोड़ा और नीचे पढ़ना चाहेंगे जीसी मदद: तो यह आह्वान करने के लिए पता नहीं है The GC has an incomplete view of the process and may not run when memory is low because the GC doesn't know that memory is low. और Managed Callable Wrappers do not add additional instance members

मूल रूप से

, यह BaseActivity प्रकट होता, एक Android प्रतिदेय आवरण (ACW) और मोनो जीसी पता नहीं है यह कितना बड़ा है कचरा कलेक्टर। जो मैं इकट्ठा करता हूं, एसीडब्ल्यू एंड्रॉइड इंटरफेस को लागू करने का एक तरीका है।

समाधान जैसा कि आपने पाया है, मैन्युअल रूप से कचरा कलेक्टर को कॉल करने के लिए है जिसे ACW के उपयोग करते समय Xamarin दस्तावेज़ों में अनुशंसित किया जाता है।

http://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/

----

इस उत्तर के मूल पोस्टिंग के बाद से, Xamarin डॉक्स इस स्थिति के अपने विवरण में सुधार हुआ है:

एक जावा का एक उदाहरण .Lang.Object प्रकार या व्युत्पन्न प्रकार आकार में कम से कम 20 बाइट्स है। प्रबंधित कॉल करने योग्य रैपर अतिरिक्त उदाहरण सदस्यों को नहीं जोड़ते हैं, इसलिए जब आपके पास एंड्रॉइड है। ग्राफिक्स.बिटमैप उदाहरण है कि मेमोरीन की 10 एमबी ब्लॉब को संदर्भित करता है, Xamarin.Android के जीसी को यह नहीं पता होगा कि - जीसी को 20- बाइट ऑब्जेक्ट और निर्धारित करने में असमर्थ होगा कि यह एंड्रॉइड रनटाइम-आवंटित ऑब्जेक्ट्स से जुड़ा हुआ है जो 10MB मेमोरी को जीवंत रखता है।

यह बताता है कि, कि क्या वस्तुओं को शून्य पर सेट कर रहे हैं की परवाह किए बिना या नहीं, आप अभी भी मैन्युअल Xamarin जीसी फोन अगर आप का आवंटन कर रहे हैं/प्रतिदेय रैपर deallocating है कि संभावित की एक बड़ी राशि का उपभोग कर सकते चाहिए याद।

धारणा के तहत ऑपरेटिंग जावा Object 20 बाइट्स है, यदि कोई आवंटित और 100 वस्तुओं को शून्य करता है जो प्रत्येक 10 एमबी का उपभोग करते हैं, तो एक्समरिन जीसी का मानना ​​है कि 4000 बाइट मेमोरी उपयोग में है। हकीकत में, ~ 1 जीबी उपयोग में है, और जीसी का आह्वान किया जा सकता है या नहीं।

-3

कचरा संग्रह को कॉल करना यह सुनिश्चित नहीं करता है कि कचरा संग्रह चलाएगा या सभी स्मृति आवंटन होंगे। कई बार यह किसी ऑब्जेक्ट के संदर्भ को हटाने के बारे में है। यदि किसी ऑब्जेक्ट का संदर्भ है, तो यह कचरा नहीं होगा। मुझे यह कठिन तरीका सीखना पड़ा। असल में किसी भी बिंदु पर इस समस्या को ठीक करने के लिए आप किसी ऑब्जेक्ट को किसी भी समय निकाल सकते हैं और जब आपको आवश्यकता हो तो इसे सेट करें। उदाहरण:

CustomObject cusObj = null; 
if (cusObj == null) 
{ 
    cusObj = new CustomObject(); 
} 

बस यह सुनिश्चित करना कि आप ऑब्जेक्ट को हटा दें, संदर्भ को हटा दें। लेकिन ऊपर दिए गए उत्तर में बताए गए अनुसार आप कचरा भी एकत्र कर सकते हैं। बस याद रखें कि जीसी एक वस्तु के साथ एक आइटम इकट्ठा कचरा नहीं होगा।

Garbage collection and references C#

+0

जैसा कि आप इस प्रश्न में पढ़ सकते हैं, इसकी संदर्भ समस्या नहीं है क्योंकि मैंने यह सुनिश्चित किया है साफ सब कुछ – xleon

+0

सही नहीं है ढेर अंतरिक्ष त्रुटियों का सबसे बड़ा कारण उन वस्तुओं के संदर्भ में है जो कचरा कलेक्टर को नौकरी करने की अनुमति नहीं देते हैं। – yams

+0

संदर्भ से छुटकारा पाने के लिए अपनी वस्तुओं को नकारने से पहले समस्या से छुटकारा पड़ेगा। – yams

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