पीएस: मुझे पता है कि 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()
कहा जाता है या नहीं, इस पर कोई प्रभाव नहीं पड़ता है या नहीं।
आपके पास समस्या यह है कि कोई प्रोग्राम किसी भी समय अपमानजनक रूप से मर सकता है। आपको पुनरारंभ करने के लिए साफ करने में भी सक्षम होना चाहिए। –