2012-10-29 10 views
7

मैं समझने के लिए एक नमूना डेमो प्रोग्राम बना रहा हूं कि मैं स्थिर चर के संदर्भ को कैसे रोक सकता हूं, कचरा कलेक्टर का उपयोग कर जावा में विधियों को कैसे रोक सकता हूं?क्या कचरा कलेक्टर जावा में स्थैतिक चर या विधियों पर काम करता है?

मैं कचरा कलेक्टर को रोकने के लिए कमजोर संदर्भ का उपयोग कर रहा हूं।

कक्षा Sample

public class Sample { 

    private static String userName; 
    private static String password; 
    static { 
     userName = "GAURAV"; 
     password = "password"; 
    } 
    public static String getUserName(){ 
     return userName; 
    } 
    public static String getPassword(){ 
     return password; 
    } 
} 

कक्षा User

import java.lang.ref.WeakReference; 

public class User { 

    public static void main(String[] args) { 
     /** 
     * Created one object of Sample class 
     */ 
     Sample obj1 = new Sample(); 
     /** 
     * I can also access the value of userName through it's class name 
     */ 
     System.out.println(obj1.getUserName()); //GAURAV 
     WeakReference<Sample> wr = new WeakReference<Sample>(obj1); 
     System.out.println(wr.get()); //[email protected] 
     obj1 = null; 
     System.gc(); 
     System.out.println(wr.get()); // null 
     /** 
     * I have deallocate the Sample object . No more object referencing the Sample oblect class but I am getting the value of static variable. 
     */ 
     System.out.println(Sample.getUserName()); // GAURAV 
    } 

} 
+0

कचरा कलेक्टर वस्तुओं को इकट्ठा करता है, चर नहीं। एक चर एक कंटेनर है जिसमें/शामिल/संदर्भ है। और सबसे महत्वपूर्ण बात यह है कि ज्यादातर मामलों में आप कचरा संग्रह से गड़बड़ नहीं करना चाहते हैं। – ignis

+0

बहुत अधिक सांख्यिकी। आप उन्हें क्यों मिला रहे हैं? –

+0

नहीं, आपको अपने आप को बाद में साफ करना होगा – Nactus

उत्तर

16

स्थिर क्षेत्रों वर्ग, नहीं एक व्यक्ति के उदाहरण के साथ जुड़े रहे हैं।

स्थिर फ़ील्ड साफ़ हो जाते हैं जब क्लासलोडर क्लास को अनलोड किया जाता है। कई सरल कार्यक्रमों में, यह कभी नहीं होता है।

यदि आप चाहते हैं कि फ़ील्ड किसी उदाहरण से जुड़े हों और साफ़ हो जाएं तो इंस्टेंस साफ़ हो गया है, उन्हें उदाहरण फ़ील्ड बनाएं, स्थिर नहीं।

+0

इसके अलावा, स्ट्रिंग अक्षर कभी भी GC'd नहीं हैं, क्योंकि उन्हें स्ट्रिंग शाब्दिक पूल में रखा जाता है? या यह एक प्रति श्रेणी के आधार पर भी है? –

+1

AFAIK स्ट्रिंग अक्षर साफ़ कर दिए गए हैं। यदि आप कई यादृच्छिक तारों को प्रशिक्षित करते हैं और उन्हें त्याग देते हैं तो आपको ओओएमई नहीं मिलेगी। जहां आंतरिक तारों की समस्या एक समस्या है कि जावा 6 तक वे पर्मजेन में थे और जब आप बहुत ढेर थे तो ओओएमई इस जगह को भरना संभव था। जावा 7 स्ट्रिंग अक्षर में ढेर में हैं। –

+0

आपके सभी उत्तरों के लिए धन्यवाद। –

4

System.gc() को चलाने के लिए कचरा कलेक्टर मजबूर नहीं करता है। यह सिर्फ जेवीएम के लिए एक सुझाव है कि शायद कचरा कलेक्टर चलाने के लिए यह एक अच्छा समय है। यह प्रश्न देखें - When does System.gc() do anything

3

आपको समझना चाहिए कि System.gc(); कचरा कलेक्टर को कॉल नहीं करता है। यह सिर्फ कुछ कचरे को हटाने के लिए विनम्रतापूर्वक जीसी से पूछता है। जीसी तय करता है कि क्या करना है और खुद को कब शुरू करना है। तो, उम्मीद नहीं है कि आप किसी भी तत्काल प्रभाव जब System.gc(); बुला, चर आदि

जीसी को null बताए सभी वस्तुओं है कि किसी भी तरह से नहीं पहुँचा जा सकता को हटा देखेंगे। तो यदि कोड ब्लॉक से बाहर निकला है जहां चर परिभाषित किया गया था वस्तु को हटाया जा सकता है। शून्य को स्वीकार करना संदर्भ को हटा देता है। कमजोर संदर्भ जीसी को वस्तु को हटाने से रोकता नहीं है।

मुझे आशा है कि यह स्पष्टीकरण मदद करता है।

4

, कार्यक्रम के अलावा अपने प्रश्न

  1. सं जवाब देने के लिए तरीके कचरा एकत्र क्योंकि वे पहली जगह में ढेर में मौजूद नहीं है नहीं कर रहे हैं।

  2. स्थैतिक चर कक्षा उदाहरण के हैं और कचरा एकत्र नहीं किया जाएगा एक बार लोड (सामान्य Classloaders के अधिकांश के लिए)

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