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

JavaScript में मार्क एंड स्वीप एल्गोरिदम


मार्क एंड स्वीप (Mark and Sweep) गार्बेज कलेक्शन एल्गोरिदम

यह रेफरेंस-काउंटिंग का सुधार है। "अनावश्यक ऑब्जेक्ट्स" के बजाय "अनपहुंच योग्य (unreachable) ऑब्जेक्ट्स" ढूंढता है।

तीन मुख्य चरण

  1. रूट (Root): ग्लोबल वेरिएबल्स (ब्राउज़र में window) से शुरूआत
  2. मार्क फेज: रूट से पहुंच योग्य सभी ऑब्जेक्ट्स को मार्क करें
  3. स्वीप फेज: अनमार्क्ड (अनपहुंच योग्य) ऑब्जेक्ट्स को मेमोरी से हटाएं

मार्क फेज

// उदाहरण 1: पहुंच योग्य
var obj1 = { prop1: "hello" };  // रूट (window) → obj1 → "hello" → सभी मार्क्ड

// उदाहरण 2: अनपहुंच योग्य बनाना
obj1 = null;  // obj1 अब null रेफर करता है
// "hello" वाला ऑब्जेक्ट अब अनपहुंच योग्य → अनमार्क्ड

स्वीप फेज

अनमार्क्ड ऑब्जेक्ट्स (जैसे "hello" वाला ऑब्जेक्ट) को गार्बेज कलेक्टर द्वारा मेमोरी से मुक्त किया जाता है।

साइकिल्स (Cycles) की समस्या हल

रेफरेंस-काउंटिंग में साइकिल्स समस्या थीं, मार्क-एंड-स्वीप में नहीं:

function f() {
  var obj1 = {};
  var obj2 = {};
  obj1.p = obj2;  // obj1 रेफर करता है obj2 को
  obj2.p = obj1;  // obj2 रेफर करता है obj1 को (साइकिल!)
}
f();  // फंक्शन खत्म, दोनों आउट ऑफ स्कोप
// रेफरेंस-काउंटिंग: दोनों का काउंट 1 → कभी कलेक्ट नहीं
// मार्क-एंड-स्वीप: रूट से कोई रास्ता नहीं → दोनों कलेक्ट होंगे ✅

इसे "ट्रेसिंग गार्बेज कलेक्टर" क्यों कहते हैं?

क्योंकि यह रूट से शुरू होकर सभी पहुंच योग्य ऑब्जेक्ट्स को "ट्रेस" (पता लगाता) करता है।

सीमाएं

  • नॉन-डिटरमिनिस्टिक: कब चलेगा, प्रिडिक्ट नहीं कर सकते
  • मैन्युअल ट्रिगर नहीं: JS में gc() कॉल नहीं कर सकते
  • पॉज टाइम: बड़े हीप पर "स्टॉप-द-वर्ल्ड" पॉज हो सकता है
  • मेमोरी लीक अभी भी संभव: अनइरादतन ग्लोबल रेफरेंस, क्लोजर्स, डिटैच्ड DOM

आधुनिक इंजन ऑप्टिमाइजेशन्स (V8, SpiderMonkey, आदि)

  • जनरेशनल GC: नए/पुराने ऑब्जेक्ट्स अलग-अलग ट्रैक
  • इंक्रीमेंटल/कनकरंट: छोटे टुकड़ों में, मेन थ्रेड ब्लॉक किए बिना
  • कॉम्पैक्शन: मेमोरी फ्रैगमेंटेशन कम करना
  • आइडल-टाइम GC: ब्राउज़र आइडल होने पर चलाना
  1. जावास्क्रिप्ट में import  as  और export  as  कंस्ट्रक्ट्स समझाया गया जावास्क्रिप्ट में import "as" और export "as" कंस्ट्रक्ट्स समझाया गया

    import as हमें एक नेम्ड मॉड्यूल को अलग नाम से इम्पोर्ट करने की अनुमति देता है। export as हमें एक नेम्ड मॉड्यूल को अलग नाम से एक्सपोर्ट करने की अनुमति देता है। जावास्क्रिप्ट में import as और export as कंस्ट्रक्ट के लिए कोड निम्नलिखित है: उदाहरण <!DOCTYPE html> <html lang=en> <head>

  1. JavaScript में सब-ऑब्जेक्ट्स और सरणियों वाले ऑब्जेक्ट को कैसे इम्पोर्ट करें? JavaScript में सब-ऑब्जेक्ट्स और सरणियों वाले ऑब्जेक्ट को कैसे इम्पोर्ट करें?

    JavaScript में सब-ऑब्जेक्ट्स और सरणियों वाले ऑब्जेक्ट को इम्पोर्ट करने का निम्नलिखिक कोड है:उदाहरण<!DOCTYPE html> <html lang="hi"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"

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

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