दिलचस्प पोस्ट
केवल पंक्तियों द्वारा एसक्यूएल समूह जो अनुक्रम में हैं गिथूब को प्रतिबद्ध करने पर गिट विफल हो जाता है एनयूनिट में दो वस्तुओं के बीच समानता की तुलना करें प्राकृतिक सॉर्टिंग एल्गोरिथम jQuery अपलोड प्रगति और AJAX फ़ाइल अपलोड करें अस्पष्ट PHP कोड सी से जावा के रैंडम जनरेटर का पोर्ट? एचटीएमएल / सीएसएस में चेकबॉक्स आकार समानता / अंतर के लिए दो रंगों की तुलना कैसे करें अपलोड करने से पहले फ़ाइल का आकार प्रतिबंधित करने, jQuery का उपयोग करना जावास्क्रिप्ट: location.href बनाम स्थान की स्थापना JSOF 2.0 फेसलेट्स का उपयोग करते हुए XHTML में एक और एक्सएचटीएम को कैसे शामिल करें? क्या एक सूची को स्तंभों में तोड़ने का कोई तरीका है? जावा परिणाम के परिणाम की जाँच करें कि क्या कोई परिणाम है या नहीं एंड्रॉइड एपीआई 21 टूलबार पट्टी

एंड्रॉइड में कचरा कलेक्टर

मैंने कई एंड्रॉइड उत्तर देखे हैं जो कुछ स्थितियों में कचरा कलेक्टर को बुलाते हैं।

स्मृति-भूख आपरेशन करने से पहले क्या एंड्रॉइड में कचरा कलेक्टर का अनुरोध करना एक अच्छा अभ्यास है? यदि नहीं, तो मुझे इसे केवल कॉल करना चाहिए अगर मुझे OutOfMemory त्रुटि मिलती है?

कचरा कलेक्टर का सहारा लेने से पहले मुझे अन्य चीजों का उपयोग करना चाहिए?

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड में कचरा कलेक्टर"

3.0 मधुकोश से पहले के संस्करणों के लिए: हाँ, कॉल करें System.gc()

मैंने बिटमैप बनाने का प्रयास किया, लेकिन हमेशा "VM स्मृति त्रुटि से बाहर" हो रहा था लेकिन, जब मैंने पहले System.gc() फोन किया, तो यह ठीक था।

बिटमैप बनाने के दौरान, एंड्रॉइड अक्सर मेमोरी त्रुटियों से बाहर निकलता है, और पहले कचरा इकट्ठा करने की कोशिश नहीं करता है । इसलिए, System.gc() कॉल करें, और आपके पास बिटमैप बनाने के लिए पर्याप्त मेमोरी है।

यदि ऑब्जेक्ट्स बनाने में, मुझे लगता है कि System.gc को स्वचालित रूप से कहा जाता है यदि आवश्यक हो, लेकिन बिटमैप बनाने के लिए नहीं । यह सिर्फ विफल रहता है

इसलिए मैं बिटमैप बनाने से पहले System.gc() मैन्युअल रूप से कॉल करने की सलाह देता हूं

आमतौर पर, एक कचरा कलेक्टर की उपस्थिति में, जीसी को मैन्युअल रूप से कॉल करने के लिए कभी भी अच्छा अभ्यास नहीं होता है। एक जीसी ने अनुमानी एल्गोरिदम के आसपास का आयोजन किया है जो अपने डिवाइस पर छोड़ते समय सर्वश्रेष्ठ काम करते हैं। मैन्युअल रूप से GC को कॉल करने से अक्सर प्रदर्शन कम हो जाता है।

कभी-कभी , कुछ अपेक्षाकृत दुर्लभ परिस्थितियों में, कोई भी यह जान सकता है कि किसी विशेष जीसी को यह गलत हो जाता है, और जीसी के लिए एक मैन्युअल कॉल तब कुछ सुधार कर सकता है, प्रदर्शन-वार। इसका कारण यह है कि वास्तव में "पूर्ण" जीसी को लागू करना संभव नहीं है जो सभी मामलों में बेहतर ढंग से स्मृति का प्रबंधन करेगा। ऐसी परिस्थितियों का अनुमान लगाया जा सकता है और कई सूक्ष्म कार्यान्वयन विवरणों पर निर्भर करते हैं। "अच्छा अभ्यास" जीसी को अपने द्वारा चलाया जाने देना है; जीसी को मैन्युअल कॉल अपवाद है, जिसे वास्तविक प्रदर्शन समस्या के विधिवत रूप से देखा जाने के बाद ही कल्पना की जानी चाहिए।

एंड्रॉइड एप्लिकेशन में मेमोरी के बाहर बहुत आम है अगर हम बिटमैप ठीक से नहीं संभालते, तो समस्या का समाधान होगा

 if(imageBitmap != null) { imageBitmap.recycle(); imageBitmap = null; } System.gc(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 3; imageBitmap = BitmapFactory.decodeFile(URI, options); Bitmap scaledBitmap = Bitmap.createScaledBitmap(imageBitmap, 200, 200, true); imageView.setImageBitmap(scaledBitmap); 

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

यदि अभी भी समस्या का सामना करना पड़ रहा है तो आप इन लाइन को भी जोड़ सकते हैं

 BitmapFactory.Options options = new BitmapFactory.Options(); options.inTempStorage = new byte[16*1024]; options.inPurgeable = true; 

अधिक जानकारी के लिए इस लिंक पर एक नज़र डालें

http://voices.yahoo.com/android-virtual-machine-vm-out-memory-error-7342266.html


नोट: जीसी प्रदर्शन के कारण क्षणिक "विराम" के कारण, प्रत्येक बिटमैप आवंटन से पहले ऐसा करने की सिफारिश नहीं की जाती है।

इष्टतम डिजाइन है:

  1. सभी बिटमैप निशुल्क, जो अब जरूरी नहीं है , if / recycle / null कोड दिखाया गया है। (उसमें मदद करने के लिए एक विधि बनाएं।)

  2. System.gc();

  3. नए बिटमैप को आवंटित करें

अगर आपको आउटऑफममेरी एरर मिलता है तो आमतौर पर कचरा कलेक्टर को कॉल करने में बहुत देर हो चुकी है …

यहां एंड्रॉइड डेवलपर का उद्धरण है:

ज्यादातर समय, कचरा संग्रह कई छोटे, अल्पावधि वस्तुओं और कुछ कचरा कलेक्टरों की वजह से होता है, जैसे कि जनरेशनल कचरा कलेक्टर, इन ऑब्जेक्ट्स का संग्रह अनुकूलित कर सकते हैं, जिससे कि एप्लिकेशन भी अक्सर बाधित न हो। एंड्रॉइड कूड़ा कलेक्टर दुर्भाग्यवश इस तरह के अनुकूलन करने में सक्षम नहीं है और कार्यक्षमता महत्वपूर्ण कोड पथ में अल्पावधि वस्तुओं का निर्माण इस प्रकार आपके आवेदन के लिए बहुत महंगा है।

तो मेरी समझ में, जीसी को कॉल करने की कोई जरूरी आवश्यकता नहीं है। ऑब्जेक्ट्स के अनावश्यक निर्माण से बचने में अधिक प्रयास खर्च करना बेहतर है (जैसे आकृतियों के अंदर वस्तुओं का निर्माण)

मेरा ऐप बहुत सारी छवियों का प्रबंधन करता है और यह एक आउटऑफममेरी एरर के साथ मर गया यह मेरी मदद की Manifest.xml जोड़ें में

 <application .... android:largeHeap="true"> 

ऐसा लगता है System.gc() कला एंड्रॉइड 6.0.1 नेक्सस 5x पर काम नहीं करता, इसलिए मैं Runtime.getRuntime().gc(); उपयोग करता हूं Runtime.getRuntime().gc(); बजाय।

आम तौर पर बोलने से आपको स्पष्ट रूप से जीसीसी को System.gc () से कॉल नहीं करना चाहिए। यहां तक ​​कि IO व्याख्यान ( http://www.youtube.com/watch?v=_CruQY55HOk ) है जहां वे बताते हैं कि जीसी किस तरह से लॉग इन करता है और जिसमें वे यह भी कहते हैं कि वे कभी भी नहीं देखें System.gc () क्योंकि Dalvik बेहतर जानता है आप की तुलना में ऐसा कब करना है

उपर्युक्त उत्तर में उल्लेखित उपरोक्त, पहले से ही एंड्रॉइड में जीसी प्रक्रिया (बाकी सब कुछ की तरह) कभी-कभी बग़ी इसका मतलब यह है कि डलविक जीसी एल्गोरिदम हॉटस्पॉट या जेआरोकित जेवीएम के बराबर नहीं हैं और कुछ अवसरों पर कुछ गलत हो सकता है। उन अवसरों में से एक है जब बिटमैप ऑब्जेक्ट को आवंटित किया जाता है। यह एक मुश्किल है क्योंकि यह हीप और गैर-हीप मेमोरी का उपयोग करता है और क्योंकि स्मृति बाधित उपकरण पर बिटमैप ऑब्जेक्ट का एक ढीली उदाहरण आपको आउटऑफ मेमरी अपवाद देने के लिए पर्याप्त है। इसलिए इसे बुलाए जाने के बाद आपको इस बिटमैप की ज़रूरत नहीं है आम तौर पर कई डेवलपर्स द्वारा सुझाए गए हैं और यहां तक ​​कि कुछ लोगों द्वारा अच्छा अभ्यास भी माना जाता है।

बेहतर अभ्यास एक बिटमैप पर .recycle () का प्रयोग कर रहा है क्योंकि यह इस पद्धति के लिए बनाई गई है, क्योंकि यह बिटमैप की मूल स्मृति को हटाने के लिए सुरक्षित है। ध्यान रखें कि यह बहुत ही आश्रित संस्करण है, जिसका मतलब है कि यह आमतौर पर पुराने एंड्रॉइड वर्ज़न (पूर्व 3.0 मुझे लगता है) पर आवश्यक होगा, लेकिन बाद के लोगों पर इसकी आवश्यकता नहीं होगी। इसके अलावा, इसे नए संस्करणों ईथर पर उपयोग करने में अधिक नुकसान नहीं पहुंचाएगा (बस ऐसा किसी पाश या ऐसा कुछ नहीं)। नई एआरटी रनटाइम यहां बहुत कुछ बदल चुका है क्योंकि उन्होंने बड़ी ऑब्जेक्ट के लिए विशेष "विभाजन" की शुरुआत की है लेकिन मुझे लगता है कि यह एआरटी ईथर के साथ ऐसा करने के लिए बहुत कुछ नहीं करेगा।

इसके अलावा एक बहुत ही महत्वपूर्ण नोट System.gc () के बारे में है यह विधि एक कमांड नहीं है, जो दल्विक (या जेवीएम) को जवाब देने के लिए बाध्य है। इसे अधिक आभासी मशीन से कहने पर विचार करें "क्या आप कचरा संग्रह कर सकते हैं यदि यह कोई परेशानी नहीं है"

बिटमैप निर्माण के दौरान ओओएम से बचने का सर्वोत्तम तरीका,

http://developer.android.com/training/displaying-bitmaps/index.html

OutOfMemoryError बाद कचरा कलेक्टर को कॉल करने की कोई आवश्यकता नहीं है।

यह जवाडॉक स्पष्ट रूप से बताता है:

Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.

इसलिए, कचरा कलेक्टर ने त्रुटि उत्पन्न करने से पहले ही स्मृति को मुक्त करने की कोशिश की लेकिन असफल रहे।

मैं नहीं कहूंगा, क्योंकि डेवलपर डॉक्स पर रैम उपयोग राज्य:


GC_EXPLICIT

एक स्पष्ट जीसी, जैसे कि जब आप जीसी () कहते हैं (जिसे आप कॉलिंग से बचना चाहिए और इसके बजाय आवश्यक होने पर जीसी चलाने के लिए भरोसा करें)।

मैंने बोल्ड में प्रासंगिक भाग को हाइलाइट किया है।

यूट्यूब सीरीज़, एंड्रॉइड परफॉर्मेंस पैटर्नों पर एक नज़र डालें – यह आपको आपके ऐप के मेमोरी उपयोग (जैसे एंड्रॉइड के ArrayMap और SparseArray बजाय SparseArray की तरह) को प्रबंधित करने की युक्तियां दिखाएगा।

एक्समारिन डेवलपर्स के लिए त्वरित नोट

अगर आप Xamarin में System.gc() को कॉल करना चाहते हैं। एंड्रॉइड ऐप आपको Java.Lang.JavaSystem.Gc() को कॉल करना चाहिए। Java.Lang.JavaSystem.Gc()