2011-10-24 11 views
11

पीएस: मुझे पता है कि finalize() के आधार पर मुझे सही तरीके से सफाई कैसे करें।क्या जेवीएम/जीसी कॉल 'थ्रेड /)' प्रोग्राम/थ्रेड निकास पर है?

क्या जावा गारंटी नहीं देता है कि कार्यक्रम से बाहर निकलने पर उचित कचरा संग्रह किया जाएगा?

उदा। मान लें कि मैंने इसे अक्सर क्रमबद्ध करने के बजाय कैश में कुछ डेटा रखा है, मैंने उम्मीद के साथ finalize() भी लागू किया है कि यदि किसी भी कारण से (क्रैश को छोड़कर) मेरा प्रोग्राम शानदार तरीके से निकलता है, तो कैश डीबी/फ़ाइल/कुछ को लिखा जाएगा अंतिम रूप() विधि में मेरे कोड द्वारा भंडारण। लेकिन निम्नलिखित छोटे प्रयोगों के मुताबिक ऐसा लगता है कि जेवीएम "सुन्दरता से" स्मृति को साफ नहीं करता है, यह अभी निकलता है।

Java spec (प्रोग्राम से बाहर निकलें) कहता है कि बाहर निकलने पर स्मृति/जीसी को कैसे नियंत्रित किया जाता है। या क्या मुझे कल्पना के एक अलग सेक्शन को देखना चाहिए? अगर मैं किसी भी एक System.gc() तो कोई finalize() कहा जाता है uncomment

  • :

    उदाहरण का पालन करना (अंत में उत्पादन) 1.6.0.27 64 बिट्स का उपयोग कर, विंडोज पर 7

    public class Main { 
    
         // just so GC might feel there is something to free.. 
        private int[] intarr = new int[10000]; 
    
        public static void main(String[] args) { 
         System.out.println("entry"); 
         Main m = new Main(); 
         m.foo(); 
         m = new Main(); 
         // System.gc(); 
         m.foo(); 
         m = null; 
         // System.gc(); 
         System.out.println("before System.exit(0);"); 
         System.exit(0); 
        } 
    
        @Override 
        protected void finalize() throws Throwable { 
         System.out.println("finalize()"); 
         super.finalize(); 
        } 
    
        public void foo() { System.out.println("foo()"); } 
    } 
    
    /* 
    * Prints: 
    * entry 
    * foo() 
    * foo() 
    * before System.exit(0); 
    */ 
    

    बदलाव ले लो ।

  • यदि मैं System.gc() दोनों को अनमोल करता हूं तो finalize() को दो बार बुलाया जाता है।
  • चाहे System.exit() को finalize() कहा जाता है या नहीं, इस पर कोई प्रभाव नहीं पड़ता है या नहीं।
+0

आपके पास समस्या यह है कि कोई प्रोग्राम किसी भी समय अपमानजनक रूप से मर सकता है। आपको पुनरारंभ करने के लिए साफ करने में भी सक्षम होना चाहिए। –

उत्तर

10

नहीं, जावा गारंटी नहीं देता है कि कार्यक्रम से बाहर निकलने पर जीसी ट्रिगर होगा। यदि आप एक ऑपरेशन Runtime.addShutdownHook विधि से बाहर निकलने के लिए एक ऑपरेशन करना चाहते हैं। SPEC कहता है कि this सूर्य लेख पढ़ें।

जावा प्लेटफार्म के लिए विनिर्देश के बारे में बहुत कम वादे करता है कि कचरा संग्रह वास्तव में कैसे काम करता है। यहां जावा वर्चुअल मशीन विशिष्टता (जेवीएमएस) मेमोरी प्रबंधन के बारे में कहना है।

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

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

+0

क्या यह (उदा। कल्पना) कहीं भी कहता है? – Kashyap

+1

हालांकि वर्णन आप अभी भी प्रदान की वास्तव में है कि जी सी नहीं बताता है निकास पर नहीं किया जाता है, मैं यह पर्याप्त रूप से स्पष्ट कर दिया है कि यह JVMs impls के लिए छोड़ दिया है .. धन्यवाद 'abt addShutdownHooks जानकारी के लिए()', कि पता नहीं था लगता है। – Kashyap

+1

विनिर्देशन में कोई नकारात्मक विवरण नहीं है जो 'जीसी जरूरी नहीं है कि बाहर निकलने पर चलें'। Spec में जानबूझकर अस्पष्टता और मैंने उद्धृत व्यापक विवरणों को बताया गया है। –

3

Runtime.runFinalizersOnExit() देखें। ध्यान दें कि इसे बहिष्कृत किया गया है, और शेष टिप्पणी को नोट करें। मुझे लगता है कि आप वैध रूप से उन सभी से अनुमान लगा सकते हैं जो डिफ़ॉल्ट रूप से बंद हैं, लेकिन आपको यह भी ध्यान रखना चाहिए कि इसे चालू किया जा सकता है।

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