2012-05-10 12 views
8

हाय मान लें कि मेरे पास a[dynamic], b[dynamic], c[dynamic] का तीन सरणी चर है। वे अब किसी भी आकार के हो सकते हैं मैं चर को नष्ट करना चाहता हूं। मुझे यकीन है कि मैं अब चर का उपयोग नहीं करूँगा। किसी भी विचार और सुझाव का स्वागत है।एक परिवर्तनीय मेमोरी हटाएं

+3

हर्ड की कचरा कलेक्टर से सभी तत्व को निकालने के लिए है? – adarshr

+1

आप ऐसा क्यों करना चाहते हैं? क्या आप समझते हैं कि कचरा कलेक्टर क्या करता है? –

+0

मुझे लगता है कि आप सी से जावा में जा रहे हैं !! –

उत्तर

16

आप कचरा कलेक्टर कि एक सरणी इसे करने के लिए null बताए द्वारा जारी किया जा सकता करने के लिए संकेत कर सकते हैं:

int[] a = new int[someSize]; 
    int[] b = new int[someSize]; 
    .... 
    // I no longer need 'a' 
    a = null; 
    // ... but I can still use 'b' 

लेकिन वहाँ नोट करने के लिए कर रहे हैं चीजों के एक नंबर:

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

  • वास्तव में, सरणी केवल कचरा संग्रह के लिए योग्य है अगर पहुंच योग्य नहीं है। यदि आपने किसी अन्य (अभी भी लाइव) परिवर्तनीय या पहुंच योग्य वस्तु को सरणी का संदर्भ सौंपा है, तो जीसी इसे पुनः प्राप्त नहीं करेगा।

  • वास्तविक जीवन जावा अनुप्रयोगों में ऐसा करने में शायद ही कोई बात है। गणित के सामान्य पाठ्यक्रम में चर के दायरे से बाहर जाने की अनुमति देना सामान्य अभ्यास है। आप केवल null एक चर (या ऑब्जेक्ट फ़ील्ड या सरणी तत्व) की तरह स्पष्ट करेंगे कि यदि चर लंबे समय तक गुंजाइश से बाहर नहीं जा रहा है और यह एक बड़े सरणी/ऑब्जेक्ट या नेटवर्क को संदर्भित करता है।


1 - कोई उचित JVM कार्यान्वयन को पता चल जाएगा कि स्थानीय चर दायरे से जब एक विधि बाहर निकलता है बाहर जाना। चाहे एक बेहतर ग्रैन्युलरिटी पर जेवीएम ट्रैक स्कॉप्स कार्यान्वयन विशिष्ट है, और (ईमानदार होने के लिए) I नहीं जानता कि JVMs अभ्यास में इसे कैसे संभालते हैं।

ध्यान दें कि सिर्फ कुछ के बारे में तकनीकी रूप से JLS आवश्यकताओं के अनुरूप है .... बशर्ते कि जीसी पहुंच योग्य नहीं हटाता है (यानी गैर कचरा) वस्तुओं एक काल्पनिक JVM कि कोई कचरा संग्रहण जो भी करता है शामिल हैं यही कारण है कि !

+0

या मैं भी उस विचार था। क्या यह स्मृति को हटा देगा? क्या मैं शून्य को असाइन करने के बाद जीसी को कॉल करना चाहता हूं? – special

+0

आप केवल कॉल प्राप्त करने के लिए जीसी का अनुरोध कर सकते हैं लेकिन आप – mprabhat

+0

1 की गारंटी नहीं दे सकते हैं) जीसी सरणी को मुक्त कर देगा और अंत में अंतरिक्ष को पुनः प्राप्त कर देगा। 2) आपको प्रक्रिया को तेज करने के लिए स्पष्ट रूप से जीसी को कॉल नहीं करना चाहिए। जीसी को चलाने की आवश्यकता होने पर, और हस्तक्षेप न करें। (यदि आप 'System.gc()' को स्वयं कहते हैं, तो इसका कोई प्रभाव नहीं पड़ सकता है। और यदि यह जीसी को चलाने का कारण बनता है, तो संभावना है कि यह सही समय नहीं होगा ... जीसी दक्षता स्टैंड-पॉइंट से ।) –

2

स्टीफन सी ने आपके प्रश्न का उत्तर दिया है हालांकि गैर-आदिम प्रकार के लिए आप यह भी सुनिश्चित करना चाहते हैं कि आपकी सरणी के अंदर की सभी वस्तुओं को शून्य की तरह चिह्नित किया गया है, यदि आपको इसकी आवश्यकता नहीं है, तो यह सुनिश्चित करेगा कि आपके पास स्मृति रिसाव न हो।

कुछ की तरह:

for(Object obj : myObjectArray){ 
    obj = null; 
} 

फिर अपने सरणी संदर्भ अशक्त

myObjectArray = null; 
+1

सरणी के संदर्भ के बाद शून्य है, सभी सरणी अनुक्रमणिका अप्राप्य हो जाते हैं। उन्हें पहले शून्य बनाना कोई प्रभाव नहीं पड़ता है। अब, * सरणी या उसके सूचकांक के अन्य संदर्भ हो सकते हैं, लेकिन यह इस पर कोई असर नहीं होने के साथ एक अलग मुद्दा है। – entonio

+0

@entonio - सहमत। ज्यादातर स्थितियों में, नलिंग अनावश्यक है, और यदि यह अनावश्यक है तो यह CPU चक्रों का अपशिष्ट है। और इसके अलावा, हमेशा संभावना है कि आप गलती से 'शून्य' चीजें बहुत जल्दी या बहुत आक्रामक तरीके से करेंगे। आईएमओ, यह हम इसे करने के लिए सबसे अच्छा नहीं है ... जब तक कि आपके पास यह विश्वास करने का कोई अच्छा कारण न हो कि नलिंग * नहीं होगा * एक महत्वपूर्ण स्मृति रिसाव का कारण बन जाएगा। –

0

ArrayList

arrayList.removeAll(arrayList);

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