क्या Go उसी सूक्ष्म स्मृति-लीक के अधीन है जो Java है?


89

यहाँ तथ्य हैं:

  • भाषा गो में एक कचरा संग्रहकर्ता है।

  • जावा में कचरा संग्रह है

  • बहुत सारे जावा प्रोग्राम में मेमोरी लीक (सूक्ष्म या नहीं) होती है

एक जावा प्रोग्राम के उदाहरण के रूप में जिसमें मेमोरी लीक है (दिल की बेहोशी के लिए नहीं, सवाल आपके विश्वास को हिला सकता है), यहां देखें टॉमकैट नामक एक छोटे से जावा प्रोग्राम के बारे में, जिसमें "लीक खोजें" बटन भी है: क्या कोई रास्ता है टॉमकैट में अस्वाभाविक स्मृति लीक से बचने के लिए?

इसलिए मैं सोच रहा हूं: क्या गो में लिखे गए कार्यक्रम उसी तरह के (सूक्ष्म या नहीं) मेमोरी लीक का प्रदर्शन करते हैं जो जावा एक्ज़िबिट में लिखे गए कुछ प्रोग्राम हैं?


29
"बहुत सारे जावा प्रोग्राम्स में मेमोरी लीक (सूक्ष्म या नहीं) है" क्या आपके पास इस "तथ्य" का कोई सबूत है या यह सिर्फ एक बात कर रहा है।
पीटर लॉरी

17
@Webinator: मुझे लगता है कि आपको इन "सूक्ष्म स्मृति लीक" में से एक का उदाहरण देने की आवश्यकता है जो "बहुत सारे" जावा संस्करण हैं। जब तक आप कचरा संग्रहकर्ता में बग का दावा नहीं कर रहे हैं, तब तक शुद्ध जावा में मेमोरी को लीक करने का एकमात्र तरीका उन संदर्भों पर पकड़ है जो अब आप किसी संग्रह में वस्तुओं को रखकर उदाहरण के लिए उपयोग नहीं कर रहे हैं और उन्हें कभी भी उस संग्रह से हटा नहीं रहे हैं। अगर इस तरह की लीक का आप जिक्र कर रहे हैं, तो दुनिया की कोई भी भाषा उनके खिलाफ रक्षा नहीं करेगी, जिसमें गो भी शामिल है।
जेरेमीपीपी

14
यहाँ मेमोरी लीक्स हैं जिनके बारे में मैं बात कर रहा था (+200 अपवोट्स, +150 अपवोट्स के साथ उत्तर, वास्तविक जावा मेमोरी लीक्स के बहुत सारे विवरण): stackoverflow.com/questions/6470651/…
SyntaxT3rv0r

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

6
यह सवाल नाटक के बिना और "कट्टरता", "किसी के विश्वासों को झकझोरने" और इस तरह की टिप्पणियों के बिना कर सकता था। Esp। चूँकि पूरी चर्चा "मेरी परिभाषा तुमसे memory leakबेहतर है " पर उबाल मारती है।
एलएएफके का कहना है कि मोनिका ऑक्ट

जवाबों:


44

आप यहां विभिन्न प्रकार की मेमोरी लीक को भ्रमित कर रहे हैं।

जावा, (या किसी अन्य GC आधारित भाषा) में जघन्य, स्पष्ट-स्मृति-प्रबंधन आधारित मेमोरी लीक हैं। ये लीक पूरी तरह से स्मृति के विखंडन तक पहुंच खोने के कारण होते हैं, उन्हें अप्रयुक्त के रूप में चिह्नित किए बिना।

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


23
स्मृति रिसाव बस जब आप स्मृति मुक्त करने के लिए भूल जाते हैं। जावा में यह तब होता है जब आप अशक्त के संदर्भ सेट करना भूल जाते हैं। C ++ में ऐसा होता है अगर आप फ्री कॉल करना भूल जाते हैं। दोनों वैध मेमोरी लीक के मामले हैं। और मूलभूत समस्या समान है, आप अधिक से अधिक मेमोरी का उपयोग करते हैं जब तक कि यह अंततः आउटऑफमेरी त्रुटि के साथ दुर्घटनाग्रस्त न हो जाए।
निकोलस बॉस्केट

1
हालांकि यह सच है कि कोई भी भाषा प्रोग्रामर को इस तरह की लॉजिक एरर करने से नहीं रोक सकती, लेकिन यह भी सच है कि कुछ ऐसी गलतियाँ जावा एसडीके में ही मौजूद हैं (उदाहरण के लिए, java.util.logging.Levelजिसमें एक प्राइवेट स्टैटिक ArrayListहै जिसमें ऐसी सभी ऑब्जेक्ट्स बनते हैं निर्माण पर रखा गया है, और जिसमें से वे कभी नहीं हटाए जाते हैं), जो कि जावा से प्रोग्रामिंग करते समय उनसे बचने के लिए कठिन बना देता है, किसी अन्य भाषा की तुलना में जिसमें इस तरह की खामियां नहीं होती हैं
जूल्स

7
मुझे लगता है कि ओपी वस्तुओं की मेमोरी लीक के बारे में पूछ रहा था जो वास्तव में अप्राप्य हैं जैसे कि जुड़े हुए प्रश्न के स्वीकृत उत्तर में। स्मृति रिसाव जो थ्रेड्स से क्लास लोडिंग के कारण होता है। -1
qbt937

1
यह भी बोधगम्य है कि स्थैतिक विश्लेषण यह निर्धारित कर सकता है कि क्या संदर्भ उनके उपयोगी जीवन काल को जारी रखते हैं - कोई मन-पढ़ने की आवश्यकता नहीं है।
काइल स्ट्रैंड

1
@ अमृत नहीं, कचरा संग्रहकर्ता आपके पास अब संदर्भ नहीं है स्मृति एकत्र करता है । यह जानने का कोई तरीका नहीं है कि क्या यह ठीक है जिसे आप अभी भी एक संदर्भ के लिए हटा दें।
राफेल श्मिट

19

यह बहुत संभव है कि गो कार्यक्रम मेमोरी लीक को प्रदर्शित करेगा। गो के वर्तमान कार्यान्वयन में एक सरल मार्क-एंड-स्वीप कचरा कलेक्टर है। यह केवल एक अस्थायी समाधान के रूप में अभिप्रेत है और दीर्घकालिक कचरा संग्राहक के रूप में इसका इरादा नहीं है। अधिक जानकारी के लिए इस पेज को देखें । हेडर के नीचे देखें Go Garbage Collector। यदि आप इच्छुक हैं तो उस पृष्ठ में भी वर्तमान संस्करण के लिए कोड का लिंक है।


1
जावा में मार्क और स्वीप कलेक्टर की समस्याओं में से एक मेमोरी फ्रेजेशन है। जबकि तकनीकी रूप से मेमोरी नहीं है, यह एप्लिकेशन को उपलब्ध मेमोरी का नुकसान हो सकता है।
पीटर लॉरी

9

एक 'मेमोरी लीक' तब होता है जब प्रोग्रामर ने सोचा कि मेमोरी का एक टुकड़ा मुक्त हो जाएगा। यह किसी भी भाषा में हो सकता है, कचरा एकत्र किया जाए या नहीं। जीसी भाषाओं में सामान्य कारण मेमोरी के लिए एक अतिरिक्त संदर्भ बनाए रखना है।

"भाषाएं मेमोरी लीक का कारण नहीं बनती हैं, प्रोग्रामर मेमोरी लीक का कारण बनते हैं"।


8

कचरा संग्रह या नहीं, आप एक प्रोग्राम लिख सकते हैं जिसमें अधिकांश भाग के लिए जावा, गो, या किसी अन्य भाषा में मेमोरी-लीक हैं।

कचरा संग्रह प्रोग्रामर से कुछ बोझ उठाता है लेकिन यह लीक को पूरी तरह से रोकता नहीं है।


4
मैं जानता हूँ मैं जानता हूँ। मैं विशेष रूप से थोड़े सूक्ष्म स्मृति-लीक के बारे में बात कर रहा हूं जो जावा में मौजूद हैं यहां तक ​​कि मुश्किल जावा भी है, इसकी शुरुआत में, एक भाषा के रूप में विपणन किया गया था जहां मेमोरी लीक जीसी के लिए धन्यवाद मौजूद नहीं है
SyntaxT3rr0r

4
खेद है कि स्पष्ट नहीं था। आपने कहा "बहुत सारे जावा प्रोग्राम में मेमोरी लीक (सूक्ष्म या नहीं) है"।
jzd

3

आप यहाँ अमूर्त स्तरों का मिश्रण कर रहे हैं: मेमोरी लीक लाइब्रेरी में बग्स के कारण होता है (जहाँ ऑब्जेक्ट एक दूसरे को संदर्भित करते हैं, हालांकि 'a होल्ड रेफरेंस टू बी' की चेन के साथ-साथ दक्षता के बीच कचरा संग्रहकर्ता के कार्यान्वयन में एक व्यापार बंद हो जाता है) सटीकता। आप इस तरह के छोरों को खोजने में कितना समय बिताना चाहते हैं? यदि आप दो बार अधिक खर्च करते हैं, तो आप दो बार लंबे समय तक छोरों का पता लगाने में सक्षम होंगे।

तो स्मृति रिसाव का मुद्दा प्रोग्रामिंग भाषा विशिष्ट नहीं है, इसका कोई कारण नहीं है कि स्वयं ही GO जावा से बेहतर या बदतर होना चाहिए।


1
मैं पूरी तरह से सहमत नहीं हूँ। मेमोरी लीक इस तथ्य के कारण है कि जावा पैर में एक-स्व को शूट करना संभव बनाता है और यह जरूरी नहीं है कि यह लाइब्रेरी बग से संबंधित हो। बहुत सारे प्रोग्रामर प्रोग्राम लिखते हैं जो धीरे-धीरे लेकिन निश्चित रूप से जावा में मेमोरी लीक करते हैं और यह उनकी अपनी गलती है, न कि पुस्तकालयों की गलती। इसके अलावा, अगर जावा जीसी ठीक समय / संभव-रिसाव ट्रेडऑफ़ बना रहा है, तो क्या गो एक ही ट्रेडऑफ़ बना रहा है?
SyntaxT3rr0r

1
और सवाल वास्तव में नहीं है "मुझे इस तरह के छोरों को खोजने में कितना समय बिताना है?" सवाल यह है कि "चश्मा कितने समय तक गो को ऐसे छोरों पर खर्च करने का आदेश देता है" , जो आईएमएचओ एक दिलचस्प सवाल है।
SyntaxT3rr0r

16
चक्रीय संदर्भ श्रृंखलाएं जावा में कचरा संग्रहण को नहीं रोकती हैं।
एंडी थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.