किस प्रकार का कचरा संग्रह गो उपयोग करता है?


111

गो एक कचरा एकत्रित भाषा है:

http://golang.org/doc/go_faq.html#garbage_collection

यहाँ यह कहता है कि यह एक मार्क-एंड-स्वीप कचरा संग्रहकर्ता है, लेकिन यह विवरण में नहीं आता है, और एक प्रतिस्थापन काम करता है ... फिर भी, यह पैराग्राफ गो रिलीज़ होने के बाद से बहुत अपडेट नहीं हुआ है।

यह अभी भी मार्क-एंड-स्वीप है? क्या यह रूढ़िवादी या सटीक है? क्या यह पीढ़ीगत है?


2
जुलाई २०१ 201 के माध्यम से अप कचरा कलेक्टर के इतिहास की एक लंबी चर्चा के लिए, ब्लॉग
Wildcard

जवाबों:


117

1.4+ कचरा कलेक्टर के लिए योजनाएँ:

  • हाइब्रिड स्टॉप-द-वर्ल्ड / समवर्ती कलेक्टर
  • स्टॉप-द-वर्ल्ड हिस्सा 10ms की समय सीमा तक सीमित है
  • सीपीयू कोर समवर्ती कलेक्टर को चलाने के लिए समर्पित है
  • त्रि-रंग चिह्न और स्वीप एल्गोरिथ्म
  • गैर पीढ़ीगत
  • गैर compacting
  • पूरी तरह से सटीक
  • यदि प्रोग्राम इधर-उधर घूम रहा है, तो छोटी लागत लगाता है
  • कम विलंबता, लेकिन गो 1.3 जीसी की तुलना में सबसे अधिक संभावना कम थ्रूपुट भी है

गो १.१ के शीर्ष पर १.३ कचरा संग्राहक अद्यतन करें:

  • समवर्ती स्वीप (छोटे विराम समय में परिणाम)
  • पूरी तरह से सटीक

1.1 कचरा संग्रहकर्ता जाएं:

  • निशान और झाडू (समानांतर कार्यान्वयन)
  • गैर पीढ़ीगत
  • गैर compacting
  • ज्यादातर सटीक (स्टैक फ्रेम को छोड़कर)
  • रोकने के दुनिया
  • बिटमैप-आधारित प्रतिनिधित्व
  • शून्य-लागत जब प्रोग्राम मेमोरी आवंटित नहीं कर रहा है (जो है: चारों ओर फेरबदल सी के रूप में तेजी से होता है, हालांकि व्यवहार में यह सी की तुलना में कुछ धीमा चलता है क्योंकि गो संकलक सी संकलक जैसे कि जीसीसी के रूप में उन्नत नहीं है)
  • वस्तुओं पर फाइनल का समर्थन करता है
  • कमजोर संदर्भों के लिए कोई समर्थन नहीं है

जाओ 1.0 कचरा कलेक्टर:

  • गो १.१ के समान है, लेकिन ज्यादातर सटीक होने के बजाय कचरा कलेक्टर रूढ़िवादी है। रूढ़िवादी जीसी [] बाइट जैसी वस्तुओं की अनदेखी करने में सक्षम है।

उदाहरण के लिए, एक भिन्न के साथ GC को प्रतिस्थापित करना विवादास्पद है:

  • बहुत बड़े ढेर को छोड़कर, यह स्पष्ट नहीं है कि क्या एक पीढ़ीगत जीसी समग्र रूप से तेज होगा
  • पैकेज "असुरक्षित" पूरी तरह से सटीक जीसी और कॉम्पैक्टिंग जीसी को लागू करना मुश्किल बनाता है

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

3
@uriel: हां, मैंने अपने उत्तर में 1 आइटम में इसका उल्लेख किया है - पाठ "(समानांतर कार्यान्वयन)"।

क्या यह उत्तर अभी भी चालू है?
किम स्टेबेल

c # कचरा संग्राहक सटीक है और c # की तरह में जाने पर आपके पास एक
स्ट्रोक के

3
के बारे में क्या यह अद्यतन 1.5.x के साथ सिर्फ एक अच्छा इतिहास लॉग बनाने के लिए अद्यतन करें।
इस्माइल

32

( गो 1.8 - Q1 2017 के लिए, नीचे देखें )

अगले गो 1.5 समवर्ती गारबेज कलेक्टर को शामिल करने में सक्षम "गति" जीसी कहा। इस पत्र में
एक प्रस्ताव प्रस्तुत किया गया है जो इसे गो 1.5 के लिए बना सकता है, लेकिन गो में मौजूद जीसी को समझने में भी मदद करता है।

आप राज्य को 1.5 से पहले देख सकते हैं (दुनिया रोकें: STW)

गो 1.5 से पहले, गो ने एक समानांतर स्टॉप-द-वर्ल्ड (STW) कलेक्टर का उपयोग किया है।
जबकि एसटीडब्ल्यू संग्रह में कई डाउनसाइड हैं, यह कम से कम अनुमानित और नियंत्रणीय ढेर विकास व्यवहार करता है।

https://40.media.tumblr.com/49e6556b94d75de1050c62539680fcf9/tumblr_inline_nr6qq8D9FE1sdck2n_540.jpg

( गोफरकॉन 2015 प्रस्तुति " गो जीसी: गोइंग लेटेंसी प्रॉब्लम इन गो 1.5 " से फोटो )

एसटीडब्ल्यू कलेक्टर के लिए एकमात्र ट्यूनिंग घुंडी "जीओजीसी" थी, जो संग्रह के बीच सापेक्ष वृद्धि है। डिफ़ॉल्ट सेटिंग, 100%, ट्रिगर कचरा संग्रह हर बार हीप आकार पिछले संग्रह के रूप में लाइव हीप आकार से दोगुना हो गया है:

https://docs.google.com/drawings/image?id=sLJ_JvGfPfPnojLlEGLCWkw&rev=1&h=113&w=424&ac=1

एसटीडब्ल्यू कलेक्टर में जीसी समय।

गो 1.5 एक समवर्ती कलेक्टर का परिचय देता है ।
एसटीडब्ल्यू संग्रह पर इसके कई फायदे हैं, लेकिन यह विकास को नियंत्रित करने के लिए कठिन विकास करता है क्योंकि कचरा कलेक्टर चल रहा है, जबकि आवेदन मेमोरी को आवंटित कर सकता है

https://40.media.tumblr.com/783c6e557b427a5c023520578740eb94/tumblr_inline_nr6qqpmaJx1sdck2n_540.jpg

( गोफरकॉन 2015 प्रस्तुति " गो जीसी: गोइंग लेटेंसी प्रॉब्लम इन गो 1.5 " से फोटो )

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

  • कलेक्टर को भी जल्दी शुरू करें, और एप्लिकेशन बहुत सारे कचरा संग्रह का प्रदर्शन करेगा, सीपीयू संसाधनों को बर्बाद कर देगा।
  • कलेक्टर को बहुत देर से शुरू करें, और आवेदन वांछित अधिकतम वृद्धि को पार कर जाएगा।

संगामिति का त्याग किए बिना सही संतुलन प्राप्त करने के लिए कचरा कलेक्टर को ध्यान से रखने की आवश्यकता होती है।

जीसी पेसिंग का लक्ष्य दो आयामों के साथ अनुकूलन करना है: ढेर वृद्धि, और कचरा कलेक्टर द्वारा उपयोग किया गया सीपीयू।

https://docs.google.com/drawings/image?id=sEZYCf7Mc0E0EGmy4gho3_w&rev=1&h=235&w=457&ac=1

जीसी पेसिंग के डिजाइन में चार घटक होते हैं:

  1. जीसी चक्र की स्कैनिंग कार्य की मात्रा के लिए एक अनुमानक की आवश्यकता होगी,
  2. म्यूटेटर के लिए एक मैकेनिज्म, जो ढेर के आवंटन तक पहुंचता है, स्कैन की गई कार्य की अनुमानित राशि को ढेर लक्ष्य तक पहुंचाता है,
  3. जब म्यूटेंट सीपीयू बजट को कम करता है, और जब पृष्ठभूमि की स्कैनिंग के लिए एक अनुसूचक
  4. जीसी ट्रिगर के लिए एक आनुपातिक नियंत्रक।

डिजाइन समय के दो अलग-अलग विचारों को संतुलित करता है: सीपीयू समय और ढेर समय

  • सीपीयू समय मानक दीवार घड़ी समय की तरह है, लेकिन GOMAXPROCSसमय तेजी से गुजरता है।
    यही है, अगर GOMAXPROCS8 है, तो आठ सीपीयू सेकंड हर दीवार को दूसरे और जीसी को दो सेकंड का सीपीयू समय हर दीवार दूसरी बार मिलता है।
    CPU अनुसूचक CPU समय का प्रबंधन करता है।
  • हीप समय का मार्ग बाइट्स में मापा जाता है और म्यूटेटर आवंटित होने पर आगे बढ़ता है।

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


20

यह जीसी का कार्यान्वयन है:

https://github.com/golang/go/blob/master/src/runtime/mgc.go

स्रोत में डॉक्स से:

जीसी म्यूटेटर थ्रेड्स के साथ समवर्ती चलाता है, टाइप सटीक (उर्फ सटीक) है, कई जीसी धागे को समानांतर में चलाने की अनुमति देता है। यह एक समवर्ती चिह्न और स्वीप है जो लेखन अवरोध का उपयोग करता है। यह गैर-जेनेरिक और गैर-कॉम्पैक्टिंग है। आवंटन आम मामले में ताले को समाप्त करते हुए विखंडन को कम करने के लिए प्रति आवंटन क्षेत्रों में अलग आकार के उपयोग से किया जाता है।


8

1.8 जीसी जीओ फिर से विकसित हो सकता है, प्रस्ताव के साथ "एसटीडब्ल्यू स्टैक को फिर से स्कैन करें"

गो 1.7 के रूप में, अनबाउंड और संभावित गैर-तुच्छ स्टॉप-इन-वर्ल्ड (STW) समय का एक शेष स्रोत स्टैक री-स्कैनिंग है।

हम एक हाइवा राइट बैरियर को स्विच करके स्टैक री-स्कैनिंग की आवश्यकता को समाप्त करने का प्रस्ताव करते हैं जो एक युसा-स्टाइल डिलीटेशन राइट बैरियर [युसा '90] और डिक्स्ट्रा-स्टाइल इंसर्नेशन राइट बैरियर [दिक्जस्त्र -78] को जोड़ती है ।

प्रारंभिक प्रयोगों से पता चलता है कि यह सबसे खराब स्थिति वाले STW समय को 50 , से कम कर सकता है, और यह दृष्टिकोण STW के निशान को पूरी तरह से समाप्त करने के लिए इसे व्यावहारिक बना सकता है।

घोषणा यहाँ है और आप देख सकते हैं प्रासंगिक स्रोत के लिए प्रतिबद्ध है d70b0fe और पहले।


3

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


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