Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> JavaScript

JavaScript में रेफरेंस-काउंटिंग गार्बेज कलेक्शन


रेफरेंस-काउंटिंग गार्बेज कलेक्शन

सबसे सरल GC एल्गोरिदम: प्रत्येक ऑब्जेक्ट का रेफरेंस काउंट ट्रैक करता है। काउंट 0 होने पर ऑब्जेक्ट कलेक्टेबल।

कैसे काम करता है

<script>
  var obj = { x: { y: 2 } };  // 2 ऑब्जेक्ट्स बने
  // obj → {x: {...}} (काउंट 1)
  // obj.x → {y: 2} (काउंट 1)
  
  obj = 1;  // obj अब नंबर रेफर करता है
  // पहला ऑब्जेक्ट: काउंट 0 → कलेक्टेबल
  // दूसरा ऑब्जेक्ट (obj.x): काउंट 0 → कलेक्टेबल
</script>

सीमा: सर्कुलर रेफरेंस (Cycles)

दो ऑब्जेक्ट्स एक-दूसरे को रेफर करें → दोनों का काउंट ≥1 → कभी कलेक्ट नहीं (भले ही अनपहुंच योग्य हों)।

<script>
  function f() {
    var obj1 = {};
    var obj2 = {};
    obj1.p = obj2;  // obj1 → obj2
    obj2.p = obj1;  // obj2 → obj1 (साइकिल!)
    // फंक्शन खत्म: दोनों आउट ऑफ स्कोप
    // लेकिन रेफरेंस काउंट 1-1 → GC नहीं करेगा ❌
  }
  f();
</script>

इतिहास: IE6/7 में समस्या

  • DOM: रेफरेंस काउंटिंग
  • JS इंजन: मार्क-एंड-स्वीप
  • क्रॉस-रेफरेंस (JS ↔ DOM) → लीक
  • आधुनिक ब्राउज़र्स: दोनों मार्क-एंड-स्वीप → हल

क्यों अब उपयोग नहीं होता?

पहलूरेफरेंस काउंटिंगमार्क-एंड-स्वीप
सर्कुलर रेफरेंस❌ फेल✅ हैंडल करता है
ओवरहेडहर असाइनमेंट पर काउंट अपडेटपीरियॉडिक स्कैन
पॉज टाइमछोटे, लगातारबड़े, कभी-कभी
रियल-टाइमबेहतरकठिन

आधुनिक उपयोग

कुछ सिस्टम्स में अभी भी उपयोगी:

  • C++ shared_ptr (साइकिल्स के लिए weak_ptr)
  • Python (साइकिल डिटेक्टर के साथ)
  • PHP, Objective-C (ARC)
  • कुछ एम्बेडेड JS इंजन्स

निष्कर्ष

JavaScript इंजन्स (V8, SpiderMonkey, JavaScriptCore, Chakra) मार्क-एंड-स्वीप और इसके वेरिएंट्स उपयोग करते हैं। रेफरेंस काउंटिंग ऐतिहासिक संदर्भ के लिए महत्वपूर्ण।

  1. JavaScript में शॉर्टहैंड फंक्शन्स (Arrow Functions) समझाएं JavaScript में शॉर्टहैंड फंक्शन्स (Arrow Functions) समझाएं

    एरो फंक्शन्स जिन्हें शॉर्टहैंड फंक्शन्स भी कहा जाता है, ES2015 में पेश किए गए थे और हमें फंक्शन को छोटे तरीके से लिखने की अनुमति देते हैं। उनका अपना this बाइंडिंग नहीं होता और वे आसपास के कॉन्टेक्स्ट से this प्राप्त करते हैं।JavaScript में शॉर्टहैंड फंक्शन्स दर्शाने का कोड:उदाहरण<!DOCTYPE html>

  1. जावास्क्रिप्ट में for...in स्टेटमेंट समझाया गया जावास्क्रिप्ट में for...in स्टेटमेंट समझाया गया

    for...in लूप ऑब्जेक्ट की सभी प्रॉपर्टीज के माध्यम से लूप करता है। जावास्क्रिप्ट में for..in स्टेटमेंट को लागू करने का कोड निम्नलिखित है - उदाहरण <!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-scale=1.0

  1. जावास्क्रिप्ट में ऑब्जेक्ट्स की समानता समझाएं जावास्क्रिप्ट में ऑब्जेक्ट्स की समानता समझाएं

    जावास्क्रिप्ट में प्रिमिटिव्स जैसे स्ट्रिंग, नंबर, बूलियन आदि की तुलना उनके मानों द्वारा की जाती है जबकि ऑब्जेक्ट्स (नेटिव या कस्टम) की तुलना उनके रेफरेंस द्वारा की जाती है। रेफरेंस द्वारा तुलना का अर्थ है कि दो या अधिक ऑब्जेक्ट्स मेमोरी में एक ही स्थान को इंगित करते हैं या नहीं। जावास्क्रिप्ट में