यह विशिष्ट कचरा कलेक्टर पर निर्भर हो सकता है, इसलिए एक उत्तर इस बात पर निर्भर करेगा कि आप किस जावास्क्रिप्ट इंजन का उपयोग कर रहे हैं।
सबसे पहले, मुझे लगता है कि सबसे अच्छा एप्लिकेशन कोड दो चीजें करता है। यह कार्यक्षमता और प्रदर्शन के अपने तकनीकी लक्ष्यों को प्राप्त करता है, और यह बदलने के लिए लचीला है। अतिरिक्त कोड को अतिरिक्त जटिलता को न्यायसंगत बनाने के लिए पर्याप्त उद्देश्य प्रदान करना चाहिए।
इसी के साथ
कहा, Google's notes on V8, जो Chrome द्वारा उपयोग JavaScript इंजन है,
के अनुसार अब एक प्रक्रिया कचरा संग्रहण के रूप में जाना आवश्यक हैं कि वस्तुओं के द्वारा प्रयोग किया स्मृति वी 8 reclaims। तेजी से ऑब्जेक्ट आवंटन सुनिश्चित करने के लिए, शॉर्ट कचरा संग्रहण विराम, और कोई स्मृति विखंडन V8 एक स्टॉप-द-वर्ल्ड, जेनरेशनल, सटीक, कचरा कलेक्टर नियोजित करता है। इसका मतलब है कि वी 8:
- कचरा संग्रहण चक्र करते समय प्रोग्राम निष्पादन रोकता है।
- अधिकांश कचरा संग्रहण चक्रों में ऑब्जेक्ट ढेर का केवल एक हिस्सा संसाधित करता है। यह एप्लिकेशन को रोकने के प्रभाव को कम करता है।
- हमेशा जानता है कि सभी ऑब्जेक्ट्स और पॉइंटर्स स्मृति में कहां हैं। यह पॉइंटर्स के रूप में गलत रूप से पहचानने वाली वस्तुओं से बचाता है जो स्मृति लीक में परिणाम दे सकते हैं।
वी 8 में, वस्तु ढेर को दो भागों में खंडित किया जाता है: नई जगह है जहाँ ऑब्जेक्ट का निर्माण होगा, और पुराने अंतरिक्ष के लिए जो एक कचरा संग्रहण चक्र जीवित वस्तुओं को बढ़ावा दिया जाता है। यदि किसी ऑब्जेक्ट को कचरा संग्रहण चक्र में स्थानांतरित किया गया है, तो V8 ऑब्जेक्ट पर सभी पॉइंटर्स अपडेट करता है।
पीढ़ी के कचरे के संग्राहक ढेर के बीच वस्तुओं को स्थानांतरित करते हैं, जहां सभी जीवित वस्तुओं को एक गंतव्य ढेर में स्थानांतरित किया जाता है। गंतव्य पर स्थानांतरित नहीं किया गया कुछ भी कचरा माना जाता है। यह स्पष्ट नहीं है कि वी 8 कचरा कलेक्टर लाइव ऑब्जेक्ट्स की पहचान कैसे करता है, लेकिन हम सुराग के लिए कुछ अन्य जीसी कार्यान्वयन देख सकते हैं।
एक अच्छी तरह से प्रलेखित जीसी कार्यान्वयन के व्यवहार का एक उदाहरण के रूप में, जावा के समवर्ती मार्क-स्वीप कलेक्टर:
- आवेदन रोकता है।
- एप्लिकेशन कोड से पहुंचने योग्य वस्तुओं की एक सूची बनाता है।
- एप्लिकेशन को फिर से शुरू करता है। समानांतर में, सीएमएस कलेक्टर एक "चिह्न" चरण चलाता है, जिसमें यह पारगमनशील पहुंच योग्य वस्तुओं को "कचरा नहीं" के रूप में चिह्नित करता है। चूंकि यह प्रोग्राम निष्पादन के साथ समानांतर है, यह एप्लिकेशन द्वारा किए गए संदर्भ परिवर्तनों को भी ट्रैक करता है।
- एप्लिकेशन को रोकता है।
- नई पहुंच योग्य वस्तुओं को चिह्नित करने के लिए एक दूसरा ("टिप्पणी") चरण चलाता है।
- एप्लिकेशन को फिर से शुरू करता है। समानांतर में, यह सभी वस्तुओं को कचरा के रूप में पहचाना जाता है और ढेर ब्लॉक को पुनः प्राप्त करता है।
यह मूल रूप से एक ग्राफ ट्रैवर्सल है, जो एक सेट विशिष्ट नोड्स से शुरू होता है। चूंकि डिस्कनेक्ट की गई वस्तुएं सुलभ नहीं हैं, इसलिए अन्य डिस्कनेक्ट की गई वस्तुओं से उनकी जुड़ाव खेल में नहीं आनी चाहिए।
कुछ अच्छा है, अगर जावा कचरा संग्रह http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf पर काम करता है तो कुछ अच्छा है। कचरा संग्रह जावा के लिए अद्वितीय नहीं है, इसलिए मुझे जावा आभासी मशीनों और जावास्क्रिप्ट इंजन जैसे अन्य रनटाइम द्वारा उठाए गए विभिन्न दृष्टिकोणों के बीच कुछ समानता पर संदेह होगा।
रेमंड चेन ने blog post लिखा था जो इंगित करता है कि चलने वाली स्मृति को आप प्रदर्शन पर नकारात्मक प्रभाव डाल सकते हैं। संदर्भ एप्लिकेशन शटडाउन पर मैन्युअल रूप से स्मृति मुक्त करने के आसपास था। चूंकि ब्लॉक डिस्क पर बदल दिए जा सकते थे, इसलिए ट्रैवर्सिंग संदर्भों का कार्य उन ब्लॉकों को स्वैप करने का कारण बन सकता है। इस मामले में, प्रोग्राम ब्लॉक के ट्रैवर्सल कर रहा है जिसे अभी उपलब्ध के रूप में चिह्नित किया गया होगा और बिना छूटे छोड़े गए होंगे।
तो ऐसी स्थिति में जहां ओएस ने कुछ ब्लॉकों को बदल दिया हो, कचरा कलेक्टर "विशेष रूप से लंबे समय तक रहने वाली वस्तुओं पर" सहायता करने का कार्य, धीमा चीजों को धीमा कर सकता है।
और यदि आप स्वैपिंग के बारे में चिंतित होने के लिए पर्याप्त डेटा नहीं बना रहे हैं, तो उचित कचरा कलेक्टर को नोटिस करने में काफी समय नहीं लगेगा।
तो संभावना है कि यह प्रयास के लायक नहीं है, और प्रतिकूल हो सकता है। हालांकि यह संभवतः ढेर "प्रभुत्व" के संदर्भ को छोड़ने के लिए समझ में आता है। ये वे वस्तुएं हैं जो एकत्र की जाती हैं, कई अन्य वस्तुओं के संग्रह की अनुमति देगी। तो संग्रह को संदर्भ में छोड़ दें, लेकिन संग्रह के भीतर प्रत्येक आइटम को नहीं।
मुझे विश्वास नहीं है कि कोई दिलचस्प/उपयोगी/बेवकूफ सवाल नहीं आया है। +1। –
मुझे यह उत्तर बहुत दिलचस्प लगता है: http://stackoverflow.com/a/4324162/752527 –