2010-08-17 13 views
5

मेरे Android एप्लिकेशन निम्न त्रुटि के साथ क्रैश हो रहा है:

ERROR/dalvikvm(7051): HeapWorker is wedged: 10037ms spent inside Lcom/android/internal/os/BinderInternal$GcWatcher;.finalize()V 

तो यह लग रहा है GCWatcher की तरह> अंतिम रूप देने के 10s ले जा रहा है।

ऐसा तब होता है जब एक AsyncTask दूरस्थ सर्वर से HTTP के माध्यम से डेटा पुनर्प्राप्त/पास कर रहा है। यह हमेशा इस त्रुटि को फेंक नहीं देता है और यह हाल ही में हो रहा है ... पहले यह ठीक काम कर रहा है और ऐप कोड अपरिवर्तित है।

कोई भी जानता है कि इस त्रुटि का कारण क्या है और मैं इसे कैसे रोक सकता हूं?

उत्तर

4

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

GcWatcher.finalize विधि बहुत छोटा है। यदि इसे चलाने के लिए 10 सेकंड लगते हैं, तो ऐसा इसलिए होता है क्योंकि बाकी सिस्टम द्वारा धागा भूखा हो रहा है। आमतौर पर ऐसा होता है कि उस प्रक्रिया में कुछ अन्य निम्न प्राथमिकता वाले थ्रेड आवंटन करने का प्रयास कर रहे हैं, लेकिन समाप्त हो जाता है क्योंकि सीपीयू इसे और अधिक समय नहीं देना चाहता है। (सामान्य प्राथमिकता) HecWorker थ्रेड अटक जाता है जब GcWatcher.finalize एक नई अंतिम वस्तु बनाने के लिए प्रयास करता है। (सीएफ। "प्राथमिकता उलटा")

एक शांत प्रणाली पर ऐसा नहीं होना चाहिए, क्योंकि प्रत्येक धागे में कुछ काम करने के लिए पर्याप्त समय होना चाहिए।

आपके पास लॉगकैट में एक पूर्ण स्टैक ट्रेस होना चाहिए। देखो कि अन्य धागे कहाँ हैं। आप यह देखने के लिए "शीर्ष" जैसे प्रोग्राम को भी चला सकते हैं कि क्या आपने हाल ही में स्थापित कुछ सीपीयू को भिगो रहा है और स्थिति को बढ़ा रहा है।

एंड्रॉइड का कौन सा संस्करण आप चल रहे हैं? थ्रेड प्राथमिकता सामग्री प्रत्येक रिलीज के साथ बदल गई है (हाल ही में "cgroup" तंत्र का उपयोग कर)।

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