2015-06-07 2 views
13

जहां तक ​​मुझे पता है, हम जावा में कचरा संग्रह के लिए मजबूर नहीं कर सकते हैं। सबसे अच्छा हम कर सकते हैं System.gc() या Runtime.gc() पर कॉल करके अनुरोध भेजना। ऐसा करने से कचरा संग्रह का अनुरोध JVM को भेजा जाएगा, लेकिन यह गारंटी नहीं है कि कचरा संग्रह होगा। तो मेरा सवाल है: क्या कोई विशेष कारण हैं, क्यों जेवीएम इस तरह से डिज़ाइन किया गया है कि यह फोर्स कचरा संग्रह का समर्थन नहीं करता है?क्यों JVM को इस तरह से डिज़ाइन किया गया है कि यह कचरा संग्रह को बल की अनुमति नहीं देता है?

+1

ऐसा क्यों होना चाहिए? एक कचरा संग्रह को मजबूर करने के लिए यह कैसे उपयोगी है? – Henry

+6

ए * विशेष * जेवीएम कार्यान्वयन * हो सकता है * गारंटी देने का चयन करें कि ऐसा जीसी करेगा। ओरेकल/ओपन जेडीके नहीं करते हैं। यहां सवाल है: "किस * कार्यान्वयन कारण * के लिए 'जीसी' मानक जेवीएम में एक रोक-जीसी को तुरंत मजबूर नहीं करता है?" – user2864740

+0

मान लीजिए कि आप अनुचित समय पर जीसी विराम से बचना चाहते हैं, तो आप शायद कम-रोक कचरा कलेक्टर (जैसे सीएमएस या जी 1) का उपयोग करके और लगातार आवश्यक वस्तुओं के लिए ऑब्जेक्ट पूल का उपयोग करके उनका सामना कर सकते हैं।इससे _stop-the-world_ ईवेंट को कम से कम कम करना चाहिए, क्योंकि ऑब्जेक्ट पूल को ढेर विखंडन का सामना करना चाहिए, जो सीएमएस और जी 1 के लिए एचिलिस एड़ी है। – mucaho

उत्तर

16

कचरा संग्रह को मजबूर करना अक्षम है, और अधिकांश मामलों में अनावश्यक ... यदि आपने अपना प्रोग्राम सही तरीके से लिखा है।

संदर्भ:

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

यह मुद्दा कि जावाडोक बना रहा है यह है कि यह मंच निर्भर है, और एक पोर्टेबल एप्लिकेशन इस पर भरोसा नहीं कर सकता है।


अपने प्रश्न का रूप:

क्यों JVM एक तरीका है कि इसका समर्थन नहीं करता फोर्स कूड़ा संग्रह में बनाया गया है?

ताकि JVM बुरी तरह लिखित कोड के प्रदर्शन प्रभाव के खिलाफ संरक्षित किया जा सके; जैसे एप्लेट्स, प्लगइन्स, तृतीय पक्ष पुस्तकालयों, आदि

(और मुझे लगता है कि मूल सूर्य इंजीनियरों ने शिकायत की है कि "जावा धीमी है" जब असली समस्या अनावश्यक कॉल थी System.gc() ...)


1 - लेकिन हमेशा नहीं। उदाहरण के लिए, सुविधाजनक समय पर System.gc() को कॉल करना एक असुविधाजनक समय पर जीसी से संबंधित विराम से बचने का एक तरीका हो सकता है। हालांकि, अगर आपका कोड केवल तभी काम करता है यदि आप कुछ बिंदुओं पर जीसी चलाते हैं, तो आप कुछ गलत कर रहे हैं।

3

जावा डिज़ाइन किया गया है ताकि (सी ++ के विपरीत) आपको अप्रयुक्त स्मृति को पुनः प्राप्त करने के साथ स्वयं को चिंता न करें। यदि रनटाइम मेमोरी सही तरीके से कॉन्फ़िगर की गई है, तो आपको कचरा संग्रह से खुद को चिंता करने की आवश्यकता नहीं है। ऐसा कहकर, एक जीसी() करना आम तौर पर युवा पीढ़ी की जगह को खत्म कर देगा।

+1

गोश, और यहां मैंने सोचा कि कचरा कलेक्टर जो सी ++ के लिए लागू किए गए हैं वास्तव में काम किया! उस तरफ, कचरा संग्रह ** ** ** का मतलब है कि आप स्मृति प्रबंधन को अनदेखा कर सकते हैं। [जावा में मेमोरी लीक] बनाने के लिए यह आसान है (http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java)। –

+0

@PeteBecker - क्या आप बोहेम जीसी, स्मार्ट पॉइंटर्स, या कुछ और जैसे रूढ़िवादी सी ++ कलेक्टरों का जिक्र कर रहे हैं? –

+0

@StephenC - स्मार्ट पॉइंटर्स स्वचालित मेमोरी प्रबंधन का एक रूप है, लेकिन वे कचरा संग्रह नहीं हैं। –

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