2009-04-13 9 views
12

यदि मैं एक सामान्य लिस्प छवि के भीतर एक वेब सर्वर जैसे लंबे समय तक चलने वाले एप्लिकेशन की मेजबानी कर रहा हूं, तो कचरा कलेक्टर का प्रबंधन करने के लिए मुझे किस रणनीति का उपयोग करना चाहिए?लंबे समय तक चलने वाले आम लिस्प एप्लिकेशन में, कचरा प्रबंधन के लिए किस रणनीति का उपयोग किया जाना चाहिए?

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

क्या इस पर नियंत्रण करने के लिए आम लिस्प में कोई विधि है? शायद इसे 'छोटे और अक्सर' तरीके से काम करने के लिए प्रोत्साहित करके?

+0

आप किस लिस्पी कार्यान्वयन का उपयोग कर रहे हैं? – Zifre

+0

जब आप कहते हैं "मैं मान रहा हूं", ऐसा लगता है कि आप बिना किसी प्रोफ़ाइल के अनुकूलन करने की कोशिश कर रहे हैं। क्या आप विशिष्ट समस्याओं को देख रहे हैं जिन्हें आपके पर्यावरण में फिक्सिंग की आवश्यकता है? – Ken

+0

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

उत्तर

24

कई लिस्प कार्यान्वयन में उत्कृष्ट कचरा संग्राहक हैं। एक विशेष समस्या यह है कि लिस्प अनुप्रयोगों में अक्सर छोटी वस्तुओं (conses, ...) की उच्च आवंटन दर होती है।

विचार करने के लिए कुछ बातें हैं।

  • सटीक बनाम कंज़र्वेटिव जीसी। मैं लिस्प के लिए रूढ़िवादी जीसी (बोहेम इत्यादि) का एक बड़ा प्रशंसक नहीं हूं। रूढ़िवादी जीसी की एक समस्या यह है कि उन्हें सभी कचरा नहीं मिला है। यह लंबे समय तक चलने वाले कार्यक्रमों के लिए एक समस्या हो सकती है और विखंडन का कारण बन सकती है और अप्रयुक्त स्मृति को पुनः प्राप्त नहीं किया जा सकता है। सटीक जीसी लिस्प डेटा की टैग जानकारी का उपयोग कर रहे हैं और प्रत्येक ऑब्जेक्ट के प्रत्येक डेटा प्रकार की पहचान कर सकते हैं। कंज़र्वेटिव जीसी का आविष्कार प्रोग्रामिंग भाषा कार्यान्वयन के लिए किया गया था जो टैग किए गए डेटा (सी ++, ...) का उपयोग नहीं करते हैं।

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

  • क्षणिक जीसी। इसका मतलब है कि पहला जीसी चरण है जो मुख्य रूप से मुख्य स्मृति में चलता है और स्मृति प्रबंधन इकाई से कुछ समर्थन प्राप्त करता है ताकि बदले गए स्मृति क्षेत्रों की पहचान हो सके। मुख्य मेमोरी स्कैनिंग वर्चुअल मेमोरी स्कैन करने से स्कैनिंग है और केवल स्कैनिंग मेमोरी एरिया स्कैनिंग से काम की मात्रा कम हो जाती है। जब बहुत सारी वस्तुओं को आवंटित किया जाता है और जल्दी ही कचरे में बदल जाता है, तो यह बहुत कम जीसी विराम देता है।

  • पीढ़ी जीसी। आम तौर पर जीसी आजकल पीढ़ी हैं। एक से अधिक पीढ़ी और वस्तुओं से बचने वाले कुछ जीसी को पुरानी पीढ़ी में बढ़ावा दिया जाता है। आम तौर पर केवल पहली पीढ़ी ही जीसीड होती है।

  • ट्यूनिंग। जीसी, कहते हैं, लिस्पॉर्क्स और एलेग्रो सीएल में बहुत सारे ट्यूनिंग knobs हैं। विशेष रूप से लंबे समय तक चलने वाले अनुप्रयोगों के लिए मैन्युअल को पढ़ने के लिए समझदारी होती है और उदाहरण के लिए पीढ़ियों की संख्या, उनके आकार और अन्य चीजों को ट्यून करें।

  • वर्चुअल मेमोरी। वर्चुअल मेमोरी पर जीसी आमतौर पर बहुत धीमी होती है।यदि संभव हो तो उससे बचें - मशीनों में और रैम जोड़ें।

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

  • ढेर आवंटन। कुछ सामान्य लिस्प कुछ डेटा के ढेर आवंटन की अनुमति देते हैं - ब्लॉक छोड़कर स्वचालित रूप से स्मृति को मुक्त कर देता है। यह तब मानता है कि ब्लॉक को छोड़ने पर स्मृति का संदर्भ नहीं दिया जाता है।

  • समवर्ती जीसी। सामान्य सामान्य लिस्प कार्यान्वयन में से कोई भी समवर्ती जीसी और समवर्ती लिस्प धागे के लिए समर्थन नहीं है। कुछ कार्यान्वयन में समवर्ती लिस्प थ्रेड होते हैं, लेकिन जीसी काम कर रहे सभी को रोक देगा।

  • जीसी प्रोफाइलिंग। यदि आप सुनिश्चित नहीं हैं कि आवंटन कहाँ होता है और जीसी क्या करता है, तो आपको प्रोफाइलिंग जानकारी का उपयोग करके इसे ढूंढना होगा।

यदि आपके लिस्प के पास एक सटीक पीढ़ी जीसी है जो मुख्य स्मृति में चलता है तो लंबे समय तक समस्याओं को हल करना मुश्किल होता है। क्लोजर सीएल (एक मुफ्त आम लिस्प कार्यान्वयन) उदाहरण के लिए एक बहुत अच्छा जीसी कार्यान्वयन है। आप आभासी स्मृति में स्मृति विखंडन और कचरा संग्रह से बचना चाहते हैं। यदि आवश्यक हो तो अधिक मुख्य स्मृति के साथ 64 बिट लिस्प कार्यान्वयन का उपयोग करें।

प्वाइंटर:

आप दस्तावेज़ से देख सकते हैं कि LispWorks और एलेग्रो सीएल के पास ट्यूनिंग के लिए बहुत सारे knobs हैं जी सी।

आम लिस्प में कुछ कार्य हैं जो कार्यान्वयन पर्यावरण से निपटते हैं। (आरओओएम) एक ऐसा कार्य है जो स्मृति उपयोग का एक अवलोकन देता है। (रोम टी) अधिक जानकारी देता है (यहां LispWorks):

CL-USER 2 > (room t) 
Generation 0: Total Size 1823K, Allocated 1090K, Free 725K 
      Segment 2008AAB8: Total Size 507K, Allocated 361K, Free 142K 
        minimum free space 64K, 
         Awaiting promotion = 0K, sweeps before promotion =10 
      Segment 217E7050: Total Size 1315K, Allocated 729K, Free 582K 
        minimum free space 0K, 
         Awaiting promotion = 0K, sweeps before promotion =2 
Generation 1: Total Size 1397K, Allocated 513K, Free 871K 
      Segment 20CB9A50: Total Size 68K, Allocated 48K, Free 15K 
        minimum free space 0K, 
         Awaiting promotion = 0K, sweeps before promotion =4 
      Segment 216D7050: Total Size 1088K, Allocated 331K, Free 752K 
        minimum free space 0K, 
         Awaiting promotion = 0K, sweeps before promotion =4 
      Segment 2004E4F8: Total Size 241K, Allocated 133K, Free 103K 
        minimum free space 0K, static 
Generation 2: Total Size 2884K, Allocated 1290K, Free 1585K 
      Segment 21417050: Total Size 2816K, Allocated 1227K, Free 1584K 
        minimum free space 0K, 
         Awaiting promotion = 0K, sweeps before promotion =4 
      Segment 20DA5DA0: Total Size 68K, Allocated 62K, Free 1K 
        minimum free space 117K, 
         Awaiting promotion = 0K, sweeps before promotion =4 
Generation 3: Total Size 19373K, Allocated 19232K, Free 128K 
      Segment 20109A50: Total Size 11968K, Allocated 11963K, Free 0K 
        minimum free space 3K, 
         Awaiting promotion = 0K, sweeps before promotion =10 
      Segment 20DB6E18: Total Size 6528K, Allocated 6396K, Free 128K 
        minimum free space 0K, 
         Awaiting promotion = 0K, sweeps before promotion =10 
      Segment 20CCAAC8: Total Size 876K, Allocated 872K, Free 0K 
        minimum free space 0K, 
         Awaiting promotion = 0K, sweeps before promotion =10 

Total Size 25792K, Allocated 22127K, Free 3310K 
+0

मुझे नहीं लगता कि टैग उपयोग का आपका विवरण पूरी तरह से सही है। एक सटीक जीसी वास्तव में निर्णय लेगा कि किसी ऑब्जेक्ट के टैग को देखने के द्वारा कैसे साफ किया जाए (जैसा कि अपरिचित होगा), लेकिन सबसे पहले यह जानना होगा कि एक रजिस्टर की सामग्री ऑब्जेक्ट पॉइंटर या तत्काल मान है या नहीं। यह बाद का ऑपरेशन वह है जो सटीक जीसी से सटीक को अलग करता है। – skypher

+0

विभिन्न चीजों की एक सरणी लें: तत्काल वस्तुएं (संख्याएं, वर्ण, ...) और गैर-तत्काल वस्तुओं (सरणी उनके लिए एक सूचक है: सरणी, संरचनाएं, तार, ...)।जीसी कैसे जानता है कि एक चीज एक संख्या है और दूसरा एक सूचक (संरचना के लिए) है? कंज़र्वेटिव जीसी सी और सी ++ जैसी भाषाओं के लिए विकसित किया गया था जहां कोई टैग की गई वस्तुएं नहीं हैं। जीसी जोरदार ढंग से निर्धारित करता है कि एक सूचक क्या हो सकता है और क्या नहीं। –

+0

यह सी जैसे अनगिनत भाषाओं के लिए विकसित किया गया हो सकता है, लेकिन इसका उपयोग आज भी कुछ लिस्प वातावरण में किया जाता है, उदाहरण के लिए, सीएमयूसीएल और एसबीसीएल x86: http: //sbcl-internals.cliki जैसे "गरीब पंजीकृत" आर्किटेक्चर पर एक रूढ़िवादी जीसी का उपयोग करते हैं। शुद्ध/GENCGC – Ken

2

कचरा संग्रह शुरुआती दिनों से काफी लंबा सफर तय कर चुका है, और अप्रत्याशित लंबे इंतजार से बचने के लिए बहुत सारे काम किए गए हैं। आधुनिक कार्यान्वयन के लिए, मुझे लगता है कि वे अतीत की बात हैं।

हालांकि, कचरा संग्रह का विवरण कार्यान्वयन द्वारा भिन्न होता है। वहां बहुत से उच्च गुणवत्ता वाले लिस्प कार्यान्वयन नहीं हैं, इसलिए आपको कचरा संग्रह पर उनके दस्तावेज़ों से परामर्श करने में कोई कठिनाई नहीं होनी चाहिए।

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