2009-06-17 14 views
5

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

यह थोड़ी देर के लिए ठीक काम करता है, लेकिन अब एक बिंदु पर जहां मैं एक ऐरेलिस्ट को पुनः प्राप्त करने में सक्षम होने की उम्मीद करता हूं, मुझे लगता है कि मैं "शून्य" हूं।

मुझे आश्चर्य है कि स्थिर वर्ग "कचरा कलेक्टर" को भेजा गया है या नहीं। सुनिश्चित नहीं है कि क्या हो रहा है, अगर आप मदद कर सकते हैं तो इसकी बहुत सराहना की जाएगी।

+3

की तरह कुछ के बारे में मैं वैश्विक चर पता बुरा कर रहे हैं। – Ankur

+1

"स्थिर वर्ग" क्या है? क्या आपका मतलब स्थिर चर, या घोंसला वाले आंतरिक वर्ग वाला वर्ग है? – skaffman

+0

क्षमा करें, आप सही हैं। स्थिर चर और विधियों वाला एक वर्ग – Ankur

उत्तर

2

यदि आप ऑब्जेक्ट की तुलना में फ़ंक्शन को कॉल कर सकते हैं तो कचरा नहीं होगा क्योंकि इसमें अभी भी एक संदर्भ है। क्या आप सरणी सूची या ऑब्जेक्ट में पॉइंटर संग्रहीत कर रहे हैं?

+0

ऐरेलिस्ट स्वयं – Ankur

9

आप इसे अंतिम बनाने के लिए कोशिश कर सकते हैं, और यदि कुछ अन्य वर्ग अशक्त के संदर्भ में परिवर्तन देखने के लिए आदेश में कोड पुनः संकलित करें:

public class Global { 

    public final static List<String> data = new ArrayList<String>(); 

} 

इस लिखने की अनुमति:

Global.data.add("foo"); 

लेकिन नहीं:

Global.data = null; 
+1

इसे आज़माएं, एक अच्छी सलाह है। +1 –

+0

या ट्रिगर करने के लिए एक डीबगर में ब्रेकपॉइंट सेट करें यदि चर कभी भी शून्य पर सेट हो। आपको एक आसान स्टैकट्रैक और सब कुछ देता है =) – mikek

+1

यह एक स्थिर वर्ग नहीं है। यह एक वर्ग है जिसमें स्थिर चर शामिल है, जो एक ही बात नहीं है। – UncleO

0

कचरा कलेक्टर निपटान नहीं करेगा ई अपने स्वयं के द्वारा एक स्थिर वर्ग। कचरा कलेक्टर केवल कक्षा में कोई संदर्भ नहीं होने पर सक्रिय हो सकता है। जब तक आप कक्षा को स्वयं कॉल कर सकते हैं, तब तक एक संदर्भ है। कचरा कलेक्टर सक्रिय होने पर भी आप निश्चित रूप से नहीं कह सकते हैं। पृष्ठभूमि में निष्क्रिय कार्य अगर यह किसी प्रकार के रूप में चलता है।

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

3

मैं एक स्थिर कक्षा में कुछ चर, जो कई विभिन्न बिंदुओं पर करने के लिए ... लिखा मिलता है।

जैसा कि आप स्वयं को स्वीकार कर रहे हैं, इसलिए वेरिएबल को एक या अधिक अलग-अलग बिंदुओं पर एक शून्य को असाइन किया जा सकता है। :)

0

स्थिर एक अलग धागे में स्थिर हो सकता है। अन्यथा, अगर आप इसे कुछ और नहीं बताते हैं तो यह हमेशा वहां होना चाहिए।

3

जैसा कि स्वेतलियो ने कहा, जीसी केवल ढेर पर वस्तुओं पर चलता है जिसे कहीं भी संदर्भित नहीं किया जाता है। यह जीसी-रणनीति और वीएम का उपयोग कर रहे हैं, इस पर निर्भर करता है कि चक्रों की संख्या x ले सकती है। चूंकि स्थैतिक वर्ग अनिश्चित काल तक संदर्भित हैं, इसलिए वे कभी भी जीसीएड नहीं होंगे।

तो कुछ मुद्दों पर बने हुए हैं:

  1. यह अपने कार्यक्रम की स्थापना वर्ग शून्य पर का हिस्सा हो सकता है? जब भी आपकी सरणी सूची सेट हो जाती है, तो क्या आप चीखने के लिए डीबग ध्वज सेट कर सकते हैं?
  2. क्या यह एक विशिष्ट समय पर होता है? प्रारंभ होने पर? कुछ समय बाद?
  3. एक बेवकूफ सवाल है, लेकिन आप किसी भी समय अपनी स्थिर कक्षा पर new नहीं चलाते?

आखिरी, जैसा कि आपने कहा था ... स्थैतिक चर स्थिरांक के अलावा किसी अन्य चीज़ के लिए चूसते हैं: पी एक सिंगलटन कॉन्फ़िगरेशन वास्तव में सस्ता है और बहुत बेहतर है।

1

स्टेटिक क्लास स्थिर चर की तरह नहीं हैं। यह कीवर्ड "स्थैतिक" के लिए अभी तक एक और उपयोग है। इस मामले में, यह इंगित करता है कि वर्ग शीर्ष स्तर है लेकिन किसी अन्य वर्ग के भीतर घोषित किया गया है।

तो इसका मतलब है कि आप एक स्थिर चर के विपरीत, इस वर्ग के एक से अधिक ऑब्जेक्ट को तुरंत चालू कर सकते हैं, जिसके लिए केवल एक प्रति है।

क्या आप इनमें से एक से अधिक को तत्काल कर रहे हैं और उन्हें एक जैसा होने की उम्मीद कर रहे हैं?

जीसी ऐसा नहीं लगता है कि यह मुद्दा है। यदि ऑब्जेक्ट अब वहां नहीं था, तो आप उस से ArrayList को पुनः प्राप्त नहीं कर सके।

+0

प्रश्न गलत था – dfa

2

कक्षाओं के लिए कचरा संग्रहण तब होता है जब उसके वर्ग लोडर को कचरा इकट्ठा किया जाता है। उदाहरण के लिए this question देखें। पहले जावा में एक प्रकार का समय था (मुझे लगता है कि 1.2 में) जहां स्थिर फ़ील्ड जीसी द्वारा नहीं मानी गई थीं और बहुत से वर्ग अनलोड/रीलोड खाली फ़ील्ड का कारण बनती थीं।

+0

1.0/1.1 में एक बग था जहां वर्गों को एक पहुंच योग्य वर्ग लोडर के साथ कचरा इकट्ठा किया जा सकता था। –

3

मूल प्रश्न:

जब कचरा संग्रहण के लिए एक स्थिर वर्ग के लिए होता है?

उत्तर: जब आपका आवेदन निकलता है।

+0

दरअसल, ऐसा तब हो सकता है जब कक्षा का उपयोग नहीं किया जाता है। हालांकि यह आमतौर पर तब होता है जब कक्षा लोडर साफ हो जाता है। ;) –

0

क्या इस

private static List<T> list; 


public static List<T> getList() { 
    if(list==null) 
     initList(); //private static method init list like you want 
    return list; 
} 
संबंधित मुद्दे