2012-06-29 6 views
24

मैं वर्तमान में अपने एंड्रॉइड ऐप के साथ कचरा संग्रहण समस्याओं की जांच कर रहा हूं, और मुझे यह जानकर उत्सुकता है कि क्या GC_FOR_ALLOC अन्य जीसी संदेशों जैसे GC_CONCURRENT की तुलना में एक बड़ी समस्या का संकेतक है।क्या स्मृति उपयोग की जांच करते समय GC_FOR_ALLOC अधिक "गंभीर" है?

मेरी समझ से, GC_CONCURRENT कचरा कलेक्टर को क्या करना चाहिए। ढेर एक विशेष सीमा तक पहुंच गया है, बेहतर स्मृति को साफ करें।

GC_FOR_ALLOC मुझे बताता है कि अगर मैं कोई ऑब्जेक्ट बनाने की कोशिश कर रहा हूं और ऐसा करने के लिए कोई स्मृति नहीं है तो मुझे कुछ और गंभीर हो रहा है।

क्या जीसी संदेशों के लिए प्राथमिकता या "गंभीरता" स्तर है?

+0

क्या आपने http://stackoverflow.com/questions/895444/java-garbage-collection-log-messages पढ़ा है? स्वीकार्य उत्तर में उल्लिखित लिंक आपको – kommradHomer

+0

@kommradHomer प्रतिक्रिया के लिए धन्यवाद दे सकता है लेकिन मुझे नहीं लगता कि यह यहां लागू होता है क्योंकि यह दल्विक आभासी मशीन है जो जीसी स्वीप कर रही है। मुझे अभी भी एक जानकारीपूर्ण होने का लिंक मिला है, अगर घना, पढ़ा जाए। –

उत्तर

53

एक मायने में, GC_FOR_ALLOCGC_CONCURRENT से अधिक गंभीर है, क्योंकि GC_FOR_ALLOC का मतलब है कि पर्याप्त आवंटन अनुरोध को पूरा करने स्मृति नहीं थे, इसलिए एक कचरा संग्रहण, जरूरी हो गया था, जबकि GC_CONCURRENT बस का अर्थ है कि जी सी, चल रहा तरह महसूस आम तौर पर क्योंकि है आवंटन के बाद मुफ्त मेमोरी की मात्रा निश्चित सीमा से कम हो गई।

  • Android एप्लिकेशन का एक छोटा सा ढेर जो (ऊपर एक बिंदु के लिए) बढ़ता है के साथ शुरू जब अनुप्रयोग को अधिक से अधिक स्मृति की आवश्यकता होती है, और:

    एक GC_FOR_ALLOC अपने आप में लेकिन अपने आवेदन में एक समस्या का संकेत नहीं है ढेर के आकार को बढ़ाने से पहले GC_FOR_ALLOC किया जाता है। इस मामले में GC_FOR_ALLOC पूरी तरह से सामान्य है।

  • यदि आप समवर्ती जीसी के मुकाबले मेमोरी को आवंटित करते हैं तो इसे मुक्त करने का समय है, GC_FOR_ALLOC अपरिहार्य है। और समवर्ती जीसी स्मृति मुक्त करने की तुलना में स्मृति को आवंटित करने में स्वाभाविक रूप से गलत नहीं है।

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

आप इस तर्क के लिए कोड को देखने के लिए उत्सुक हैं, तो यह tryMalloc() में dalvik.git/vm/alloc/Heap.cpp

में वैसे भी है, यदि आप कोई आपत्ति नहीं है, मुझे शक है कि logcat उत्पादन को देख करने के लिए सबसे कारगर तरीका है अपने कचरा संग्रह समस्याओं को डीबग करें। मुझे नहीं पता कि आपके पास कौन सी विशिष्ट समस्या है, लेकिन क्या आपने डीडीएमएस में आवंटन ट्रैकर जैसे टूल में देखा है और hprof-conv उपकरण की मदद से हीप डंप का विश्लेषण किया है? (http://android-developers.blogspot.se/2011/03/memory-analysis-for-android.html देखें उदाहरण के लिए।)

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मेरा ऐप थोड़ी देर के लिए जंगली में बाहर हो गया है और हम इसे कुछ अच्छी ट्यूनिंग करने पर काम कर रहे हैं। बड़े ओवरहेड में से एक जीसी 4 सेकंड की खिड़की के भीतर 30 गुना तक चल रहा था। यह वास्तव में बहुत अधिक लग रहा था। कुछ अनुकूलन के साथ, जीसी अब 6 गुना चलता है - लेकिन FOR_ALLOC एकमात्र कॉल है जिसे बनाया जा रहा है। लेकिन अब यह समझ में आता है। –

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