2010-03-19 12 views
14

मुझे पता है कि यह एक बेवकूफ सवाल हो सकता है, लेकिन मेरी पृष्ठभूमि सी ++ में और मेरी अपनी याददाश्त का प्रबंधन कर रही है।एंड्रॉइड में एकत्रित प्राचीन प्रकार के कचरे हैं?

मैं वर्तमान में कचरा संग्रह की आवृत्ति को कम करने और कम करने के लिए अपने प्रत्येक गेम में से प्रत्येक आवंटन को काट रहा हूं और "अंतराल" माना जाता है, इसलिए प्रत्येक चर जो मैं बनाता हूं वह एक वस्तु है (स्ट्रिंग और रेक्ट उदाहरण के लिए) मुझे यकीन है कि मैं अपने निर्माता में हाथ होने से पहले ही बना सकते हैं और सरल 10 लाइन कार्यों में अस्थायी चर नहीं बना बना रहा हूँ ... (मुझे आशा है कि समझ में आता है)

फिर भी मैं ही यह काम कर रहा था कुछ और आज रात और मुझे एहसास हुआ कि कचरा संग्रह और आदिम प्रकारों (int, बूलियन, फ्लोट) पर मेरी धारणा के बारे में मैं पूरी तरह से गलत हो सकता हूं। ये आदिम प्रकार चर हैं जो मैं एक 10 लाइन फ़ंक्शन में बनाते हैं जिसे 20 बार दूसरी बार जोड़ा जाता है कचरा संग्रह की मेरी समस्या के लिए?

तो एक साल पहले हर कुछ सेकंड मैं

जीसी तरह logcat में एक संदेश देखना होगा 4010 वस्तुओं/484,064 बाइट्स मुक्त कर दिया 101ms

में अब मैं उस संदेश दिखाई हर 15-90 सेकंड या तो ...

तो मेरे प्रश्न को फिर से लिखने के लिए: क्या इस संदेश को देखते समय आदिम प्रकार (int, float, boolean, आदि) शामिल हैं?

उत्तर

24

आदिम प्रकार यह स्पष्ट करते हैं वस्तुओं रहे हैं नहीं, इसलिए वे किसी भी कचरा संग्रहण का कारण नहीं है। हालांकि, आपको बहुत सावधान रहना होगा क्योंकि मुक्केबाजी के कारण एक आदिम प्रकार आसानी से ऐसा करने के बिना एक वस्तु बन सकता है।

उदाहरण के लिए, यदि आप पूर्णांक कुंजी के हैश मैप <> चाहते हैं, तो आप हैश मैप का उपयोग करेंगे। ध्यान दें कि क्योंकि "int" कोई ऑब्जेक्ट नहीं है, इसलिए इसे कंटेनर में उपयोग नहीं किया जा सकता है। इंटीजर एक प्राचीन int का एक ऑब्जेक्ट संस्करण है। जब आप इस तरह कोड लिखने, एक पूर्णांक वस्तु अपने आप आपके लिए बनाया जाएगा:

HashMap<Integer, Object> map = new HashMap<Integer, Object>(); 
int someNum = 12345; // no object created. 
map.put(someNum, null); // Integer object created. 

ध्यान दें कि सटीक एक ही बात करता है, तो आप जेनरिक का उपयोग नहीं करते हो जाएगा, लेकिन इससे भी ज्यादा छिपा:

HashMap map = new HashMap(); 
int someNum = 12345; // no object created. 
map.put(someNum, null); // Integer object created. 

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

6

ऐसा लगता है कि उत्तर नहीं है। ऐसा लगता है कि प्राइमेटिव जावा में ढेर पर रखे जाते हैं और ढेर में नहीं होते हैं और केवल वस्तुओं को कचरा इकट्ठा किया जाता है। मुझे इसके आसपास बहुत सारे संक्षिप्त संदर्भ मिले, विकिपीडिया की जांच करें। कुछ थोड़ा भारी पढ़ने के लिए, एक जेवीएम कचरा संग्रहण कार्यान्वयन पर एक पेपर देखें जो थोड़ा और स्पष्ट रूप से बताता है कि प्राइमेटिव भौतिक रूप से अलग मेमोरी स्थानों में संग्रहीत होते हैं, इसलिए उन्हें गलती संग्रह here में गलती से शामिल नहीं किया जाता है। यदि आपको स्किमिंग की तरह लग रहा है, तो पृष्ठ 4 वह है जहां इसे सबसे अधिक समझाया जाता है।

यहाँ एंड्रॉयड विशिष्ट धागे जीसी only scans pointers और कैसे it checks that

+0

एंड्रॉइड मानक स्टैक-आधारित जेवीएम नहीं चलाता है, इसका अपना पंजीकरण आधारित वीएम है। – mikerobi

2

[नोट: मेरे पास अभी तक पूर्ण टिप्पणी विशेषाधिकार नहीं हैं, इसलिए मैं इसे एक अलग उत्तर के रूप में जोड़ रहा हूं।]

ऐसा लगता है कि पुरातन ढेर में नहीं जावा में ढेर पर डाल रहे हैं और और की तरह केवल वस्तुओं कचरा एकत्र कर रहे हैं।

यह बिल्कुल सटीक नहीं है। Primitives स्थानीय चर में और कक्षाओं के स्थिर या उदाहरण क्षेत्रों के रूप में भी आयोजित किया जा सकता है। बाद के मामले में, वे वास्तव में ढेर पर संग्रहीत होते हैं, लेकिन उनके पास महत्वपूर्ण रूप से "जीवन" नहीं होता है और विशेष रूप से उस वस्तु से अलग नहीं किया जाता है जिसमें वे शामिल होते हैं।

एंड्रॉयड एक मानक ढेर आधारित JVM नहीं चलता है, यह अपने आप ही रजिस्टर आधारित वीएम है।

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

+0

तब तक प्रतीक्षा करें जब तक वे एनपीई प्राप्त न करें। एक विधि कॉल में किसी ऑटो पर कोई डिफ़ॉल्ट छोटा कन्स्ट्रक्टर नहीं होने के कारण टाइप-एरर का उपयोग करके इसका पीछा करने का प्रयास करें क्योंकि उनके एकमात्र सुराग - ओपे के मूल प्रश्न को छुपे हुए ओब्जे सृजन और जी.सी. के साथ करना है। जो कि 'सी' शैली प्रोग्रामिंग प्रतिमान के लिए प्रबंधन करना कठिन होता है, जहां कोई इसे 'डी' के साथ पूरा कर सकता है ... हालांकि सिंक्रनाइज़ किए गए कीवर्ड का उपयोग करने और ओबेज रेफ का पुनः उपयोग करने का एकमात्र प्रभावी तरीका है (जो प्राप्त करने वाला है स्थापित जावा परंपरावादियों से बहुत सारे कड़वाहट) तो वास्तव में ओपी को क्या करना है हंस-जे पढ़ना है। जीसीएच में बोहेम की टिप्पणियां –

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