2011-02-01 13 views
16

मैं एक स्थैतिक-टाइप ऑब्जेक्ट उन्मुख भाषा के लिए एक कंपाइलर लिख रहा हूं। वर्तमान में मैं उपयोग करने के लिए कचरा संग्रह एल्गोरिदम का शोध कर रहा हूं। मैं सोच रहा हूं कि कोई कलेक्टर है या नहीं:क्या कोई कचरा संग्रहण एल्गोरिदम है जो इन आवश्यकताओं को पूरा करता है?

  • ओपन सोर्स और दस्तावेज, ताकि मैं इसे कार्यान्वित कर सकूं।
  • acurrate
  • पीढ़ीगत
  • वैश्विक, यानी इस प्रक्रिया में केवल एक कलेक्टर है, के रूप में धागा प्रति एक कहने के लिए विरोध किया।
  • बड़े संग्रह से लंबे विरामों से बचने के लिए वृद्धिशील और/या समवर्ती।
  • इस प्रोग्रामिंग प्रतिमान के साथ फिट बैठता है। एक उदाहरण जो एक कलेक्टर नहीं होगा जो विनाशकारी असाइनमेंट की उपस्थिति में बहुत धीमा हो जाता है।

संपादित करें: स्पष्ट करने के लिए हो, तो एक कार्यान्वयन योग्य एल्गोरिथ्म कि यह करता है मैं सोच रहा था, नहीं वहाँ एक ऑफ-द-शेल्फ कलेक्टर हो चुका है।

+3

आप नेट को लक्षित या जावा मंच आप मुक्त करने के लिए एक हो जाएगा। –

+4

यहां एक हास्यास्पद रूप से अच्छा [लेखों की श्रृंखला] है (http://blogs.msdn.com/b/abhinaba/archive/2009/01/25/back-to-basic-series-on-dynamic-memory-management.aspx) कचरा संग्रह पर। – jason

+1

@ हेनक, वह एक कंपाइलर लिख रहा है – ThomasMcLeod

उत्तर

2

(मैं नहीं बल्कि एक टिप्पणी के रूप में इस करते हैं, लेकिन मैं नहीं है पर्याप्त प्रतिनिधि।)

आप देख रहे हैं एल्गोरिदम बजाय कोड के लिए, मैं definetely विद्वानों के लेख पर एक नज़र रखना होगा। मैं OOPSLA 2003 की कार्यवाही पर ठोकर खाई, और तुरंत मैं आपके प्रश्न के याद --- वे दो कूड़ा संग्रह पर सत्र नहीं:

http://www.oopsla.org/oopsla2003/files/pap-session-garbage-collection-1.html
http://www.oopsla.org/oopsla2003/files/pap-session-garbage-collection-2.html

उन "बिग बैंग" क्षणों का लाभ अपने शोध को शुरू करने के लिए यह है कि आप किसी भी आलेख पर Google विद्वान का उपयोग कर सकते हैं जो वादा करता है, और देखें कि शीर्षक के लिए और फिर "उद्धृत" लिंक पर क्लिक करके, अधिक अद्यतित अनुवर्ती हैं या नहीं, इसके लिए उदाहरण:

http://scholar.google.com/scholar?cites=11437015034573374705&as_sdt=2005&sciodt=0,5&hl=en

(जब से तुम इतने सारे आवश्यकताओं है, आप कई मेंढ़क चुंबन आप अपने ऑन-द-फ्लाई कलेक्टर ढूंढने के लिए हो सकता है।)

0

आप शायद मोनो से कचरा कलेक्टर चुरा सकते हैं, जो नेट का ओपन सोर्स कार्यान्वयन है। उन्होंने हाल ही में एक नया जीसी इंजन जारी किया है (मुझे लगता है) सभी उपर्युक्त आवश्यकताओं को पूरा करता है।

+0

कुछ शोध के बाद मैंने पाया कि मोनो का नया कलेक्टर स्टॉप-द-वर्ल्ड है, इसलिए यह आवश्यकताएं पूरी नहीं करता है। – keiter

0

इस तरह एक संग्राहक चोरी करने में समस्या: कचरा कलेक्टर अक्सर उस भाषा के साथ बंधे होते हैं जिसके लिए वे लिखे गए हैं। कार्यात्मक भाषाओं के लिए अच्छे संग्राहक अनिवार्य लोगों के लिए कलेक्टरों की तुलना में अलग-अलग कार्य करते हैं। ओपन सोर्स स्थानों वहाँ शायद से चोरी करने कारण है:

  • मोनो
  • OCaml
  • अजगर
  • ...
0

यह (जाहिर है) हार्ड कुछ बेहतर विचार के बिना जवाब देने के लिए है जिस भाषा को आप होस्ट करने की उम्मीद कर रहे हैं, लेकिन क्या आपने Parrot VM देखा है? PDD 9: Garbage Collection Subsystem अपने जीसी पर चर्चा करता है और आपके द्वारा पूछे जाने वाले buzzwords को हिट करता है, और जिन भाषाओं के लिए इसे डिज़ाइन किया गया था (पर्ल 6 मुख्य रूप से, लुआ के साथ और दृढ़ता से टाइप की गई जावास्क्रिप्ट-इश चीज़ जिसे मजबूत सेकंड के रूप में विनक्स कहा जाता है) निश्चित रूप से विनाशकारी असाइनमेंट और ऑब्जेक्ट्स हैं।

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

5

एक गैर-प्रयोगात्मक कचरा संग्रह एल्गोरिदम है जो वास्तव में आपकी सभी आवश्यकताओं को पूरा करता है: सरल स्वचालित refcounting। पूरी तरह से, वास्तव में एक व्यवहार्य विकल्प के रूप में पर्याप्त क्रेडिट प्राप्त नहीं होता है, लेकिन असल में यह कई स्थितियों में वास्तव में अच्छी तरह से काम करता है, कभी भी कोई बड़ी बैच देरी नहीं होती है, और जटिल जादू की कोई आवश्यकता नहीं होती है।

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

refcounting की एक छोटी सराहना की विशेषता यह है कि यह कचरा संग्रह के अन्य रूपों की तुलना में अधिक dcache- अनुकूल है।यदि आप एक लूप चला रहे हैं जो लूप के माध्यम से हर बार कुछ छोटी अस्थायी वस्तुओं को आवंटित करता है, तो एक refcounting जीसी (या स्पष्ट स्मृति प्रबंधन, निश्चित रूप से) हर बार एक ही स्मृति का पुन: उपयोग कर सकते हैं, अनावश्यक कैश फ्लश से परहेज। किसी अन्य प्रकार का जीसी समय-समय पर वस्तुओं को मुक्त कर देगा, जिसके परिणामस्वरूप एक बड़ी स्मृति पदचिह्न और इसलिए धीमा हो जाएगा।

रेफकाउंटिंग भारी बहु थ्रेडेड सिस्टम के लिए बहुत प्रभावी नहीं है, क्योंकि हर बार जब आप रिफॉउंट को स्पर्श करते हैं तो आपको ताले हासिल करने की आवश्यकता होती है। लेकिन अगर आप किसी भी तरह की नई भाषा तैयार कर रहे हैं, तो अपनी सारी भाषा में प्रदर्शन और विश्वसनीयता में सुधार करने के लिए आप एक बड़ी चीज कर सकते हैं: लगभग सभी वस्तुओं को थ्रेड के बीच साझा करने से रोकें। अर्थात। स्पष्ट साझा करना। यदि आप ऐसा करते हैं, तो आप जान लेंगे कि कौन सी ऑब्जेक्ट बनाम साझा नहीं की जाती हैं, और इसलिए रिफॉउंट को बढ़ाने/घटाने के दौरान जिन्हें लॉक किया जाना चाहिए और जिन्हें अनलॉक किया जा सकता है। जब कोई लॉकिंग नहीं होती है, तो प्रदर्शन को पुन: गणना करना वास्तव में उत्कृष्ट हो सकता है।

0

Azul कचरा कलेक्टर स्वामित्व है, लेकिन वहाँ पर्याप्त जानकारी उनके एल्गोरिथ्म के बारे में उपलब्ध है कि आप इसे की तरह कुछ को लागू करने में सक्षम होना चाहिए है: http://news.ycombinator.com/item?id=2022723

यह निश्चित रूप से समर्थन करता है, "pauseless" संग्रह है, हालांकि ऐसा करने की जटिलता है लोगों का आमतौर पर ऐसा क्यों नहीं होता है इसका एक अच्छा संकेत।

संबंधित मुद्दे