यह एक बहुत ही परेशान करने वाला प्रश्न है, और मुझे लगता है कि यह भाषा के लिए उपयोगी होने के बावजूद जावा के विरोध में कई योगदान देता है।
यह तथ्य कि आप कुछ भी करने के लिए "System.gc" पर भरोसा नहीं कर सकते हैं, अविश्वसनीय रूप से चुनौतीपूर्ण है और आसानी से भाषा के लिए "डर, अनिश्चितता, संदेह" महसूस कर सकते हैं।
कई मामलों में, मेमोरी स्पाइक्स से निपटने के लिए अच्छा है कि आप एक महत्वपूर्ण घटना होने से पहले उद्देश्य पर चलते हैं, जिसके कारण उपयोगकर्ता सोचेंगे कि आपका कार्यक्रम बुरी तरह से डिज़ाइन किया गया है / अनुत्तरदायी है।
कचरा संग्रह को नियंत्रित करने की क्षमता होना एक बहुत अच्छा शिक्षा उपकरण होगा, जिससे लोगों की समझ में सुधार होगा कि कचरा संग्रह कैसे काम करता है और कैसे प्रोग्राम का शोषण होता है यह डिफ़ॉल्ट व्यवहार के साथ-साथ नियंत्रित व्यवहार भी है।
मुझे इस सूत्र के तर्कों की समीक्षा करने दें।
- यह अक्षम है:
अक्सर, प्रोग्राम कुछ भी नहीं कर सकता है और आपको पता है कि जिस तरह से डिज़ाइन किया गया था, उसके कारण यह कुछ भी नहीं कर रहा है। उदाहरण के लिए, यह एक बड़े प्रतीक्षा संदेश बॉक्स के साथ किसी प्रकार का लंबा इंतजार कर सकता है, और अंत में यह कचरा इकट्ठा करने के लिए कॉल भी जोड़ सकता है क्योंकि इसे चलाने का समय वास्तव में समय का एक छोटा सा अंश लगेगा लंबा इंतजार लेकिन एक और अधिक महत्वपूर्ण ऑपरेशन के बीच में कार्य करने से जीसी से बचना होगा।
- यह हमेशा एक बुरा अभ्यास है और टूटे हुए कोड को इंगित करता है।
मैं असहमत हूं, इससे कोई फर्क नहीं पड़ता कि आपके पास कौन सा कचरा इकट्ठा करने वाला है। इसका काम कचरा ट्रैक करना और उसे साफ करना है।
समय के दौरान gc को कॉल करने से जहां उपयोग कम महत्वपूर्ण होता है, आप इसे तब कम कर देते हैं, जब आपका जीवन विशिष्ट कोड के चलने पर निर्भर करता है, लेकिन इसके बजाय यह कचरा इकट्ठा करने का निर्णय लेता है।
निश्चित रूप से, यह आपके इच्छित तरीके या अपेक्षा का व्यवहार नहीं कर सकता है, लेकिन जब आप इसे कॉल करना चाहते हैं, तो आप जानते हैं कि कुछ भी नहीं हो रहा है, और उपयोगकर्ता धीमे / डाउनटाइम को सहन करने के लिए तैयार है। अगर System.gc काम करता है, तो बढ़िया है! यदि ऐसा नहीं होता है, तो कम से कम आपने कोशिश की। जब तक कचरा कलेक्टर में अंतर्निहित साइड इफेक्ट नहीं होता है, तब तक कोई नीचे की तरफ नहीं होता है, अगर कचरा कलेक्टर को मैन्युअल रूप से आमंत्रित किया जाता है, तो यह कैसे व्यवहार किया जाता है, और यह अविश्वास का कारण बनता है।
- यह एक आम उपयोग मामला नहीं है:
यह एक ऐसा उपयोग मामला है जो मज़बूती से हासिल नहीं किया जा सकता है, लेकिन यह हो सकता है कि सिस्टम को इस तरह से डिज़ाइन किया गया हो। यह एक ट्रैफिक लाइट बनाने और इसे बनाने जैसा है ताकि ट्रैफिक लाइट के कुछ / सभी बटन कुछ भी न करें, यह आपको सवाल बनाता है कि बटन के साथ शुरू करने के लिए क्यों है, जावास्क्रिप्ट में कचरा संग्रह कार्य नहीं है इसलिए हम डॉन करते हैं 'इसके लिए ज्यादा से ज्यादा छानबीन करें।
- युक्ति कहती है कि System.gc () एक संकेत है कि GC को चलना चाहिए और VM इसे अनदेखा करने के लिए स्वतंत्र है।
एक "संकेत" क्या है? "अनदेखा" क्या है? एक कंप्यूटर केवल संकेत नहीं ले सकता है या कुछ को अनदेखा नहीं कर सकता है, ऐसे सख्त व्यवहार पथ हैं जो कि गतिशील हो सकते हैं जो सिस्टम के इरादे से निर्देशित होते हैं। एक उचित उत्तर में शामिल होगा कि कचरा संग्रहकर्ता वास्तव में कार्यान्वयन स्तर पर क्या कर रहा है, इसके कारण यह है कि जब आप अनुरोध करते हैं तो यह संग्रह नहीं कर सकता है। क्या सुविधा केवल एक झपकी है? क्या मुझे किसी तरह की शर्तें पूरी करनी चाहिए? ये क्या स्थितियां हैं?
जैसा कि यह खड़ा है, जावा की जीसी अक्सर एक राक्षस की तरह लगती है जिसे आप अभी भरोसा नहीं करते हैं। आप नहीं जानते कि कब आना या जाना है, आप नहीं जानते कि यह क्या करने जा रहा है, यह कैसे करने जा रहा है। मैं कुछ विशेषज्ञों की कल्पना कर सकता हूं कि उनका कचरा संग्रह प्रति निर्देश के आधार पर कैसे काम करता है, लेकिन विशाल बहुमत यह उम्मीद करता है कि यह "बस काम करता है", और आपके लिए काम करने के लिए एक अपारदर्शी-प्रतीत होने वाले एल्गोरिथ्म पर भरोसा करना निराशाजनक है।
किसी चीज के बारे में पढ़ने या कुछ पढ़ाए जाने के बीच एक बड़ा अंतर है, और वास्तव में इसे लागू करने, प्रणालियों के अंतरों को देखने और स्रोत कोड को देखने के बिना इसके साथ खेलने में सक्षम होने के बीच। इससे आत्मविश्वास / समझ / नियंत्रण की भावना पैदा होती है।
संक्षेप में, जवाब के साथ एक अंतर्निहित समस्या है "यह सुविधा कुछ भी नहीं कर सकती है, और मैं विवरण में नहीं जाऊंगा कि यह कैसे बताना है कि यह कब कुछ करता है और कब नहीं और क्यों नहीं करेगा या नहीं करेगा।" अक्सर इसका मतलब यह है कि यह केवल इसे करने की कोशिश करने के लिए दर्शन के खिलाफ है, भले ही इसके पीछे का इरादा उचित हो ”।
जावा जीसी के लिए यह ठीक हो सकता है कि वह जिस तरह से व्यवहार करता है, या वह नहीं कर सकता है, लेकिन इसे समझने के लिए, यह वास्तव में पालन करना मुश्किल है कि किस दिशा में जाने के लिए आप जीसी पर भरोसा कर सकते हैं और क्या करना है ऐसा नहीं करना है, इसलिए यह बहुत आसान है कि भाषा को अविश्वास करें, क्योंकि भाषा का उद्देश्य दार्शनिक सीमा तक व्यवहार को नियंत्रित करना है (यह एक प्रोग्रामर के लिए आसान है, विशेष रूप से नौसिखिया कुछ प्रणाली / भाषा व्यवहार से अस्तित्वगत संकट में पड़ने के लिए) सहन करने में सक्षम हैं (और यदि आप नहीं कर सकते हैं, तो आप बस भाषा का उपयोग तब तक नहीं करेंगे जब तक आपके पास नहीं है), और अधिक चीजें जिन्हें आप बिना किसी ज्ञात कारण के नियंत्रित नहीं कर सकते हैं, क्योंकि आप उन्हें नियंत्रित नहीं कर सकते हैं स्वाभाविक रूप से हानिकारक हैं।