जहां तक मुझे पता है, हम जावा में कचरा संग्रह के लिए मजबूर नहीं कर सकते हैं। सबसे अच्छा हम कर सकते हैं System.gc()
या Runtime.gc()
पर कॉल करके अनुरोध भेजना। ऐसा करने से कचरा संग्रह का अनुरोध JVM को भेजा जाएगा, लेकिन यह गारंटी नहीं है कि कचरा संग्रह होगा। तो मेरा सवाल है: क्या कोई विशेष कारण हैं, क्यों जेवीएम इस तरह से डिज़ाइन किया गया है कि यह फोर्स कचरा संग्रह का समर्थन नहीं करता है?क्यों JVM को इस तरह से डिज़ाइन किया गया है कि यह कचरा संग्रह को बल की अनुमति नहीं देता है?
उत्तर
कचरा संग्रह को मजबूर करना अक्षम है, और अधिकांश मामलों में अनावश्यक ... यदि आपने अपना प्रोग्राम सही तरीके से लिखा है।
संदर्भ:
यह पता चला है, तो आप JVM है कि आपके आवेदन (या एप्लेट या सर्वलेट या जो कुछ भी) चलेंगे की शुरूआत को नियंत्रित तो आप सुनिश्चित कर सकते हैं कि कि बुला System.gc()
जीसी चलाएगा। या कम से कम, सूर्य/ओरेकल JVMs के साथ यह मामला है ... जहां कमांड पर व्यवहार -XX
विकल्प के माध्यम से नियंत्रित किया जाता है।
यह मुद्दा कि जावाडोक बना रहा है यह है कि यह मंच निर्भर है, और एक पोर्टेबल एप्लिकेशन इस पर भरोसा नहीं कर सकता है।
अपने प्रश्न का रूप:
क्यों JVM एक तरीका है कि इसका समर्थन नहीं करता फोर्स कूड़ा संग्रह में बनाया गया है?
ताकि JVM बुरी तरह लिखित कोड के प्रदर्शन प्रभाव के खिलाफ संरक्षित किया जा सके; जैसे एप्लेट्स, प्लगइन्स, तृतीय पक्ष पुस्तकालयों, आदि
(और मुझे लगता है कि मूल सूर्य इंजीनियरों ने शिकायत की है कि "जावा धीमी है" जब असली समस्या अनावश्यक कॉल थी System.gc()
...)
1 - लेकिन हमेशा नहीं। उदाहरण के लिए, सुविधाजनक समय पर System.gc()
को कॉल करना एक असुविधाजनक समय पर जीसी से संबंधित विराम से बचने का एक तरीका हो सकता है। हालांकि, अगर आपका कोड केवल तभी काम करता है यदि आप कुछ बिंदुओं पर जीसी चलाते हैं, तो आप कुछ गलत कर रहे हैं।
जावा डिज़ाइन किया गया है ताकि (सी ++ के विपरीत) आपको अप्रयुक्त स्मृति को पुनः प्राप्त करने के साथ स्वयं को चिंता न करें। यदि रनटाइम मेमोरी सही तरीके से कॉन्फ़िगर की गई है, तो आपको कचरा संग्रह से खुद को चिंता करने की आवश्यकता नहीं है। ऐसा कहकर, एक जीसी() करना आम तौर पर युवा पीढ़ी की जगह को खत्म कर देगा।
गोश, और यहां मैंने सोचा कि कचरा कलेक्टर जो सी ++ के लिए लागू किए गए हैं वास्तव में काम किया!
@PeteBecker - क्या आप बोहेम जीसी, स्मार्ट पॉइंटर्स, या कुछ और जैसे रूढ़िवादी सी ++ कलेक्टरों का जिक्र कर रहे हैं? –
@StephenC - स्मार्ट पॉइंटर्स स्वचालित मेमोरी प्रबंधन का एक रूप है, लेकिन वे कचरा संग्रह नहीं हैं। –
- 1. क्यों AppDomain.Unload को कचरा संग्रह का परिणाम नहीं देता है?
- 2. क्या जेवीएम बल कचरा संग्रह करता है जब यह इसकी -Xmx सीमा तक पहुंचता है?
- 3. इस कार्यक्रम को अनुकूलित क्यों नहीं किया गया है?
- 4. जावा 8 'कलेक्टर' वर्ग इस तरह से डिज़ाइन क्यों किया गया है?
- 5. कोई कचरा संग्रह के साथ JVM
- 6. अनुमति ACCESS_MOCK_LOCATION को अनदेखा किया गया है?
- 7. धारावाहिक प्रति क्या है? और यह इस तरह क्यों लागू किया गया है?
- 8. संकलक इस पर्ची को क्यों देता है?
- 9. कचरा संग्रह पाइथन धीमा कर देता है?
- 10. क्यों संकलक रूपांतरण को संकुचित करने की अनुमति देता है
- 11. क्यों JSON केवल स्ट्रिंग की कुंजी को अनुमति देता है?
- 12. क्या numpy.sum इस तरह से कार्यान्वित किया गया है कि संख्यात्मक त्रुटियों से बचा जाता है?
- 13. क्या कोई JVM कचरा कलेक्टर की कमी है?
- 14. क्यों नहीं हैं और दोस्तों को बहिष्कृत किया गया है?
- 15. मार्शलिंग की अवधारणा को इस तरह क्यों कहा जाता है?
- 16. JVM कचरा संग्रहण -
- 17. एक printf() इस डबल को पॉइंटर द्वारा पारित करने की अनुमति क्यों देता है?
- 18. सी ++ इस दृष्टिकोण का उपयोग करके निजी सदस्यों को संशोधित करने की अनुमति क्यों देता है?
- 19. क्यों सी ++ टेम्पलेट ओवरलोडिंग की अनुमति नहीं देता है?
- 20. क्यों std :: unique_ptr टाइप अनुमान को अनुमति नहीं देता है?
- 21. कॉफीस्क्रिप्ट इस तरह से लूप को संकलित क्यों करता है?
- 22. क्या जावा कचरा संग्रह मेमोरी स्वैपिंग को रोकने के लिए काम करना शुरू कर देता है?
- 23. क्या कचरा संग्रह गारंटी देता है कि कोई प्रोग्राम स्मृति से बाहर नहीं होगा?
- 24. इस मामले में कनेक्टटाइमआउट को अनदेखा क्यों किया गया है?
- 25. इस वस्तु को क्यों नष्ट नहीं किया जा रहा है?
- 26. गोलांग क्यों कॉन्स मैप्स की अनुमति नहीं देता है?
- 27. प्रभावी सी ++ में घोषणा और परिभाषा को इस तरह परिभाषित क्यों किया गया है?
- 28. टेस्टएनजी कई अपेक्षित अपवादों की अनुमति क्यों देता है?
- 29. कचरा संग्रह को रोकने में बाइंडर
- 30. ggplot अपने geoms द्वारा उत्पन्न संदेशों को दबाने की अनुमति क्यों नहीं देता है?
ऐसा क्यों होना चाहिए? एक कचरा संग्रह को मजबूर करने के लिए यह कैसे उपयोगी है? – Henry
ए * विशेष * जेवीएम कार्यान्वयन * हो सकता है * गारंटी देने का चयन करें कि ऐसा जीसी करेगा। ओरेकल/ओपन जेडीके नहीं करते हैं। यहां सवाल है: "किस * कार्यान्वयन कारण * के लिए 'जीसी' मानक जेवीएम में एक रोक-जीसी को तुरंत मजबूर नहीं करता है?" – user2864740
मान लीजिए कि आप अनुचित समय पर जीसी विराम से बचना चाहते हैं, तो आप शायद कम-रोक कचरा कलेक्टर (जैसे सीएमएस या जी 1) का उपयोग करके और लगातार आवश्यक वस्तुओं के लिए ऑब्जेक्ट पूल का उपयोग करके उनका सामना कर सकते हैं।इससे _stop-the-world_ ईवेंट को कम से कम कम करना चाहिए, क्योंकि ऑब्जेक्ट पूल को ढेर विखंडन का सामना करना चाहिए, जो सीएमएस और जी 1 के लिए एचिलिस एड़ी है। – mucaho