क्या जावा डेवलपर्स को कचरा संग्रहण एल्गोरिदम के बारे में पता होना चाहिए? [बन्द है]


11

मुझे हाल ही में एक साक्षात्कार में पूछा गया है कि क्या मुझे किसी भी कचरा संग्रह एल्गोरिदम के बारे में पता है।

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

क्या आप लोग सोचते हैं कि जावा डेवलपर्स को कचरा संग्राहक एल्गोरिदम के बारे में पता होना चाहिए? यदि हाँ, तो आप मुझे बता सकते हैं कि मुझे किन लोगों पर ध्यान देना चाहिए?



1
हां, उन्हें चाहिए। अन्यथा वे सॉफ्टवेयर लिखने का जोखिम उठाते हैं जो भारी भार के तहत टूट जाता है।
क्वांट_देव

जवाबों:


9

मुझे लगता है कि कचरा संग्रह एल्गोरिदम जानना महत्वपूर्ण नहीं है यदि आप "मानक सॉफ़्टवेयर" विकसित करते हैं और सॉफ़्टवेयर प्लेटफ़ॉर्म नहीं। आपको इस बात की बुनियादी समझ होनी चाहिए कि कचरा उठाने वाला कैसे काम करता है और इसके बारे में क्या है। जब तक आप कचरा संग्रहण के कारण आपके सॉफ़्टवेयर में महत्वपूर्ण देरी का अनुभव नहीं करते हैं या आपको मेमोरी उपयोग को अनुकूलित करने की आवश्यकता होती है।

यदि आप उन एल्गोरिदम में रुचि रखते हैं, तो कृपया मेरी इस पोस्ट को देखें: कम पॉज़ जीसी के पीछे एल्गोरिदम क्या हैं?


7

कचरा संग्रह एक दिलचस्प, गैर-तुच्छ कंप्यूटर विज्ञान समस्या है।

इसके लिए एक एल्गोरिथ्म को जानना और समझना एक संकेत है कि आपके पास इन एल्गोरिदम की बहुत गहरी रुचि और समझ है। यहां तक ​​कि अगर आपने जावा के जीसी एल्गोरिदम का अध्ययन नहीं किया है, तो यह मुझे प्रभावित करेगा कि क्या कोई व्यक्ति डेटा संरचनाओं और एल्गोरिदम का उचित विवरण दे पाएगा।

एक जावा प्रोग्रामर के रूप में, यह अच्छा होगा यदि कोई डेवलपर जीसी के फायदे और नुकसान का वर्णन कर सकता है, जिसमें यह कैसे लागू किया जाता है, इसके बारे में थोड़ा ज्ञान शामिल होगा। यह इस बात का संकेत होगा कि जो उपकरण आप काम करते हैं, वे केवल निष्क्रिय रूप से उपयोग करने के बजाय कैसे उपयोग करते हैं। लागतों को जानना भी आपको उस तरीके से प्रोग्राम करने में मदद करेगा जो लागतों को कम करता है।

मैं यह नहीं कहूंगा कि जावा डेवलपर के रूप में जीवनयापन करने के लिए यह "आवश्यक ज्ञान" है, लेकिन एक प्लस कौशल जो दिखाता है कि आप सक्षम हैं और आज की नौकरी पाने के लिए आपको जो जानने की आवश्यकता है उससे थोड़ा गहरा जाने के लिए तैयार हैं।


2
एक मूल बातें जानने के बाद मैं इससे सहमत होता हूं (चीजों को समझना आपको बेहतर कोडर बनाता है)। समस्या यह है कि यदि आप जटिल विवरण जानते हैं और फिर use that informationअपना कोड डिज़ाइन करने के लिए। यह समस्याएँ पैदा कर सकता है क्योंकि जीसी में सुधार हुआ है और जीसी नहीं रह गया है और कोड इष्टतम नहीं है (और सबसे खराब स्थिति में जीसी में बाधा हो सकती है) के बारे में आपकी धारणाएँ। जानने के लिए अच्छा है, लेकिन आपको अपने कोड को सर्वोत्तम प्रथाओं का उपयोग करके डिज़ाइन करना चाहिए, जो किसी विशिष्ट कार्यान्वयन को ध्यान में नहीं रखते हैं; संकलक और जीसी हमेशा सुधार कर रहे हैं और मैक्रो ऑप्टिमाइज़ेशन अंततः उपयोगी होने में विफल रहेंगे।
मार्टिन

मैं उन पंक्तियों के साथ और अधिक सोच रहा था कि यदि आप कुछ जानते हैं कि कैसे Stringलागू किया जाता है, तो आप +लूप का उपयोग करते हुए स्ट्रिंग पर संक्षिप्त नहीं करेंगे ।
JohnMcG

4

मैं दो कारणों से देखता हूं कि किसी को यह क्यों पता होना चाहिए कि कचरा कलेक्टर (या कोई एल्गोरिथम / प्रौद्योगिकी) कैसे काम करता है। यहाँ वे हैं:
1. आपको एक बेहतर ज्ञान मिलता है कि आपके द्वारा लिखे गए कोड के नीचे क्या चल रहा है। यह अक्सर आपको अधिक कुशल कोड लिखने में मदद कर सकता है, जो बेहतर प्रदर्शन की गारंटी देगा। कुछ मामलों में यह महत्वपूर्ण हो सकता है। (मुझे एक अप्रिय अनुभव हुआ है जब GWT ब्राउज़र के कचरा संग्रहकर्ता पर भरोसा कर रहा था, और हमारे पास क्रोम के साथ बहुत बड़ी मेमोरी लीक थी। इसलिए हमें यह देखना होगा कि वास्तव में रिसाव का क्या कारण है।)
2. इस तरह के एल्गोरिदम हमेशा (या लगभग हमेशा) होते हैं। नहीं, हमेशा) स्मार्ट, कुशल, योग्य और अनुभवी डेवलपर्स पर भरोसा किया। इसलिए उनके दृष्टिकोण का अध्ययन करना बहुत उपयोगी हो सकता है।

मुझे एक और कारण दिखाई देता है कि आपसे साक्षात्कार में ऐसा प्रश्न क्यों पूछा गया। कुछ डेवलपर्स (मेरे पूर्व सहकर्मी विशेष रूप से) सोचते हैं कि एक डेवलपर स्मार्ट या कड़ी मेहनत करने वाला नहीं है, अगर वह ऐसी चीजों को नहीं जानता है। मैं इस कथन से असहमत हूं। लेकिन वैसे भी, ऐसी बातों को जानना आपके साक्षात्कारकर्ता को प्रभावित करने का एक अच्छा तरीका है।


1
मैं (2) और आधा (1) से सहमत हूं (डीबगिंग में मदद करता है)। लेकिन (1) में खतरे हैं और जीसी के एक विशेष कार्यान्वयन के साथ काम करने के लिए अपने कोड को डिज़ाइन करें कि यह अब इष्टतम नहीं होगा जब या तो जीसी में सुधार होता है या आप एक अलग प्रकार के जीसी के साथ कार्यान्वयन के लिए आगे बढ़ते हैं।
मार्टिन

@ लोकी एस्टरी, आप इसके बारे में सही हैं कि यह विशिष्ट कार्यान्वयन के लिए खतरनाक है। लेकिन, दूसरी ओर, ऐसी चीजें हैं जो नहीं बदलती हैं (लंबे समय तक, कम से कम), उदाहरण के लिए .NET के कचरा संग्रह सिद्धांत।
सुपर

@superM: वास्तव में, मोनो की जीसी माइक्रोसॉफ्ट से काफी अलग है, और अभी तक पूरी तरह से अलग एक के साथ प्रतिस्थापित होने की प्रक्रिया में है।
जोर्ग डब्ल्यू मित्तग

@superM: मुझे जावा के विकास के बारे में धीमा नहीं दिखता है: en.wikipedia.org/wiki/Java_version_history (वर्ष में एक बार ऐसा लगता है कि एक नया पैच या अपडेट है)। अगले साल एक नई रिलीज के साथ। अब इसका मतलब यह नहीं है कि जीसी को हर बार अपडेट किया जाता है, बल्कि इसके लिए क्षमता भी दिखाता है।
मार्टिन यॉर्क

@ लोकी एस्टरी, यह सही है। सॉफ्टवेयर विकास में बहुत कुछ तेजी से बदल रहा है, और हमारा काम इसके साथ बना रहना है। इसके अलावा, सभी परिवर्तन जो पहले से ही है, उसके आधार पर हैं, इसलिए मैं 1 या 2 संस्करणों के भीतर किसी भी मौलिक परिवर्तन की उम्मीद नहीं करूंगा।
सुपरएम

4

आपको जेनरल कचरा संग्रह के बारे में पता होना चाहिए, और जावा कचरा संग्रह (पर्मगेन, ईडन और टेन्योर रिक्त स्थान) के बारे में निर्दिष्ट करना चाहिए। आपको सामान्य रूप से कचरा संग्रह से भी परिचित होना चाहिए (जैसे कि संदर्भ गणना आमतौर पर एक बुरा विचार क्यों है, और मार्क-एंड-स्वीप बेहतर क्यों है)। मैं कुछ वैकल्पिक कार्यान्वयन (अज़ुल के ज़िंग जेवीएम और आईबीएम के वास्तविक समय मेट्रोनोम प्रोजेक्ट में "रुक-रुक कर जीसी" की तरह) पढ़ने की भी सिफारिश करता हूँ ।


3

आपको इस बात का ज्ञान होना चाहिए कि जावा का कचरा संग्रह दो कारणों से कैसे काम करता है:

सबसे पहले, यदि आप नहीं जानते कि यह कैसे काम करता है, तो आप गलती से डिजाइन निर्णय ले सकते हैं जो आपके वास्तविक एप्लिकेशन में सबसे खराब स्थिति का प्रदर्शन करते हैं। यह कम और कम होने की संभावना है क्योंकि जीसी में सुधार होता है, लेकिन अगर आपके पास अपने ऐप में एल्गोरिदम का विकल्प है, तो जीसी के बारे में कुछ जानने का मतलब है कि आप इसका पता लगाने के बजाय कि यह क्या करने जा रहे हैं, इसका ज्ञान उठा सकते हैं। खराब व्यवहार।

दूसरा, यदि आप नहीं जानते कि यह कैसे काम करता है, तो आप संभवतः दिए गए एप्लिकेशन के लिए GC को ट्यून नहीं कर सकते। अधिकांश जावा प्रोग्रामर को GC को ट्यून करने की आवश्यकता नहीं होती है, क्योंकि डिफ़ॉल्ट पैरामीटर ज्यादातर समय पर्याप्त रूप से काम करते हैं। यदि आप कुछ ऐसा करते हैं जो उस 'अधिकांश समय' से बाहर हो जाता है, तो आप अपने आप को जीसी मापदंडों को पूरा करते हुए पा सकते हैं। जीसी के ज्ञान के बिना ऐसा करना बस बेतरतीब ढंग से घुंडी को बदल रहा है - आपको इससे कुछ उपयोगी मिल सकता है, लेकिन अधिक संभावना है कि आप चीजों को खराब कर देंगे।

इसलिए, जब मैं जीसी के बारे में सूरज के तहत सब कुछ जानने के लिए एक अच्छे जावा प्रोग्रामर की उम्मीद नहीं करूंगा, तो मैं उम्मीद करूंगा कि प्रोग्रामर को किसी स्तर पर पता चल जाए कि जेवीएम में जीसी कैसे वे फ़ंक्शन का उपयोग कर रहे हैं, और इसके लिए ट्रेडऑफ़ क्या हैं। जीसी एल्गोरिदम।


1

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

ज्ञान का स्तर एक और सवाल है। मैं एक सामान्य डेवलपर से वास्तविक कार्यान्वयन के अंतर की व्याख्या करने की उम्मीद नहीं करूंगा (मुझे स्वयं उस पर कुछ शोध करना होगा) हालांकि एक जीसी क्या करता है और स्मृति को प्रबंधित करने के खिलाफ पेशेवरों और विपक्षों का मूल सिद्धांत क्या होना चाहिए स्पष्ट।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.