2010-03-03 17 views
6

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

+0

आपको सिस्टम.gc() को कभी भी कॉल नहीं करना चाहिए। आपको ऐसा क्यों लगता है कि आपको इसे कॉल करने की आवश्यकता है? –

उत्तर

6

हम नहीं करते हैं।

हम बस नहीं करते हैं।

शायद मेरा अनुभव सीमित है, लेकिन मेरे पास है को System.gc() को कॉल करने के लिए आवश्यक नहीं मिला।

मैं प्रदर्शन पहलू पर Brian Goetz बोली (यदि आप उसके बारे में नहीं सुना है, उसे देखो - भी और इस अनुच्छेद के बाकी को पढ़ने के लिए):

एक तीसरा वर्ग जहां डेवलपर्स अक्सर गलती से लगता है कि वे कचरा कलेक्टर की मदद कर रहे हैं System.gc() का उपयोग है, जो एक कचरा संग्रह ट्रिगर करता है (वास्तव में, यह केवल सुझाव देता है कि यह कचरा संग्रह के लिए एक अच्छा समय हो सकता है)। दुर्भाग्यवश, System.gc() एक पूर्ण संग्रह ट्रिगर करता है, जिसमें ढेर में सभी जीवित वस्तुओं का पता लगाना और पुरानी पीढ़ी को व्यापक बनाना और कॉम्पैक्ट करना शामिल है। यह बहुत काम हो सकता है।

सामान्य रूप से, सिस्टम को यह तय करना बेहतर होता है कि इसे ढेर एकत्र करने की आवश्यकता होती है, और पूर्ण संग्रह करना है या नहीं।

10

आप नहीं करते हैं। जैसा कि आप कहते हैं, कचरा संग्रह स्वचालित है। System.gc() कचरा संग्रह को भी मजबूर नहीं करता है; यह केवल जेवीएम के लिए एक संकेत है कि "अब थोड़ा साफ करने का अच्छा समय हो सकता है"

सामान्य रूप से, कचरा कलेक्टर को System.gc() के साथ जो कुछ भी आप चाहते हैं उसे करने के लिए मजबूर करने की कोशिश कर रहा है एक हैक जो लोग सोचते हैं कि वे वास्तव में उनके मुकाबले बेहतर जानते हैं, या टूटी हुई कोड के लिए एक (प्रयास) कामकाज के रूप में।

मैं वर्षों के लिए जावा लिख ​​रहा है और मैं अभी तक एक स्थिति है जहाँ बुला System.gc वास्तव में (मैं लिखा है कुछ भी में) ऐसा करना सही

+0

मैंने त्रुटिपूर्ण कोड देखा है जो वास्तव में सिस्टम.gc() के साथ धीरे-धीरे चलता है, डेवलपर्स द्वारा वे सोचते हैं कि वे बेहतर जानते हैं। –

+0

JVM (ज्यादातर एम्बेडेड/कम अंत हार्डवेयर के लिए) के कुछ कार्यान्वयन जब System.gc() कहा जाता है तो कचरा इकट्ठा करने का वादा करता है। फिर भी आपको इसकी आवश्यकता नहीं होनी चाहिए। – Thirler

+0

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

1

आप की जरूरत नहीं है था देखने के लिए है यह। इसे एक डायग्नोस्टिक टूल के रूप में सोचें, जैसे डीबग कंसोल पर लिखने में सक्षम होना।

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

1

इसे चाहिए। यह बहुत उपयोगी है इससे कोई फर्क नहीं पड़ता कि ये अन्य लोग क्या कहते हैं।

एक उपयोग उदाहरण: कहें कि आपने अभी तक एक लंबा पृष्ठभूमि कार्य पूरा कर लिया है जिसने बहुत सारी मेमोरी का उपयोग किया है। उन वस्तुओं में से कोई भी फिर से उपयोग नहीं किया जा रहा है। चूंकि कार्य में काफी समय लगेगा क्योंकि उपयोगकर्ता 5-10 सेकेंड के बारे में परवाह नहीं करेगा। यह कचरा इकट्ठा करने के लिए एक अच्छा समय है।

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

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