गार्बेज कलेक्शन (GC) ऑटोमैटिक मेमोरी मैनेजमेंट का एक रूप है। गार्बेज कलेक्टर, या सिर्फ कलेक्टर, गार्बेज को पुनः प्राप्त करने का प्रयास करता है, या उन ऑब्जेक्ट्स द्वारा कब्जा की गई मेमोरी को जो अब प्रोग्राम द्वारा उपयोग में नहीं हैं। स्वचालित रूप से यह पता लगाने की सामान्य समस्या कि क्या कुछ मेमोरी "अब और आवश्यक नहीं है" अनिर्णेय है। परिणामस्वरूप, गार्बेज कलेक्टर्स सामान्य समस्या के समाधान के एक प्रतिबंध को लागू करते हैं।
मुख्य अवधारणा जिस पर गार्बेज कलेक्शन एल्गोरिदम भरोसा करते हैं वह रेफरेंस की अवधारणा है। मेमोरी मैनेजमेंट के संदर्भ में, एक ऑब्जेक्ट को दूसरे ऑब्जेक्ट को रेफरेंस करने वाला कहा जाता है यदि पूर्व की बाद वाले तक पहुंच है (चाहे निहित रूप से या स्पष्ट रूप से)।
उदाहरण
let a = [] function addToA() { let x = {name: "John"} a.push(x) } console.log(a[0])
आउटपुट
{name: "John"}
ध्यान दें कि x अब स्कोप में नहीं है लेकिन अभी भी a का उपयोग करके एक्सेसिबल है। इसका मतलब है कि इसे तब तक मेमोरी में रहना होगा जब तक इसका रेफरेंस नहीं रह जाता। यदि हम इसे ऐरे से पॉप करते हैं, तो इसकी अब आवश्यकता नहीं होगी और इसे गार्बेज कलेक्ट किया जा सकता है।
गार्बेज कलेक्टर्स निम्न एल्गोरिदम का उपयोग करके काम करते हैं:
1. रेफरेंस-काउंटिंग गार्बेज कलेक्शन - एक ऑब्जेक्ट को "गार्बेज" कहा जाता है, या कलेक्टिबल यदि शून्य रेफरेंस इसकी ओर इशारा कर रहे हैं। यह पुराने ब्राउज़र्स में उपयोग किया जाता है। लेकिन यह सर्कुलर रेफरेंसिंग ऑब्जेक्ट्स के साथ एक समस्या पैदा करता है क्योंकि उन्हें कलेक्ट नहीं किया जा सकता (हमेशा दूसरे ऑब्जेक्ट से उनके लिए एक रेफरेंस होता है।)
2. मार्क-एंड-स्वीप एल्गोरिदम - यह एल्गोरिदम "एक ऑब्जेक्ट की अब आवश्यकता नहीं है" की परिभाषा को "एक ऑब्जेक्ट अनरीचेबल है" तक कम कर देता है। यह एल्गोरिदम ऑब्जेक्ट्स के एक सेट के ज्ञान को मानता है जिन्हें रूट्स कहा जाता है। JavaScript में, रूट ग्लोबल ऑब्जेक्ट है। समय-समय पर, GC इन रूट्स से शुरू होता है, इन रूट्स से रेफरेंस किए गए सभी ऑब्जेक्ट्स को रिकर्सिवली ढूंढता है। रूट्स से शुरू करके, GC इस प्रकार सभी रीचेबल ऑब्जेक्ट्स को ढूंढ लेगा और सभी नॉन-रीचेबल ऑब्जेक्ट्स को कलेक्ट करेगा।
आप JavaScript में GC के बारे में यहां अधिक पढ़ सकते हैं।