कचरा एकत्रित भाषाओं में लीक का मुख्य कारण अवांछित संदर्भ हैं। मेमोरी लीक को समझने के लिए, आइए देखें कि मेमोरी फ्रीिंग (कचरा संग्रह) कैसे काम करता है।
मार्क-एंड-स्वीप एल्गोरिथम -यह एल्गोरिथम "ऑब्जेक्ट की अब आवश्यकता नहीं है" की परिभाषा को "ऑब्जेक्ट अगम्य है" को कम कर देता है। यह एल्गोरिथ्म जड़ नामक वस्तुओं के एक समूह के ज्ञान को ग्रहण करता है। जावास्क्रिप्ट में, जड़ वैश्विक वस्तु है। समय-समय पर, जीसी इन जड़ों से शुरू होता है, इन जड़ों से संदर्भित सभी वस्तुओं को पुनरावर्ती रूप से खोजें। जड़ों से शुरू होकर, जीसी इस प्रकार सभी पहुंच योग्य वस्तुओं को ढूंढेगा और सभी गैर-पहुंच योग्य वस्तुओं को एकत्र करेगा।
मेमोरी लीक के प्रकार
<मजबूत>1. वैश्विक चर (अघोषित/आकस्मिक)
JS में, यदि आप एक घोषणा कीवर्ड (let, var, const) निर्दिष्ट नहीं करते हैं, तो आप वैश्विक रूप से एक चर घोषित कर सकते हैं। जेएस वैश्विक दायरे तक पहुंचने तक दायरे से बाहर निकलता हुआ दिखता है और अगर उसे किसी भी दायरे में चर नहीं मिलता है, तो यह एक वैश्विक चर बनाता है।
उदाहरण
function test() { a = [1, 2, 3] } test() // a was initialized without declaration using a keyword and is now in the global scope. console.log(a)
आउटपुट
[1, 2, 3]
यह व्यवहार स्मृति रिसाव का कारण बन सकता है क्योंकि चर अनजाने में वैश्विक दायरे में मौजूद हैं और जब तक कार्यक्रम समाप्त नहीं हो जाता तब तक मुक्त नहीं किया जाएगा। इसे डिक्लेरेशन कीवर्ड का उपयोग करके ठीक किया जा सकता है।
<मजबूत>2. बंद करना
एक स्मृति रिसाव एक क्लोजर में होता है यदि बाहरी फ़ंक्शन में एक चर घोषित किया जाता है और यह नेस्टेड आंतरिक फ़ंक्शन के लिए स्वचालित रूप से उपलब्ध हो जाता है और मेमोरी में बना रहता है, भले ही इसे नेस्टेड फ़ंक्शन में उपयोग/संदर्भित नहीं किया जा रहा हो।
<मजबूत>3. अलग किया गया DOM/DOM संदर्भ से बाहर
DOM एक डबल-लिंक्ड ट्री है, ट्री में किसी भी नोड का संदर्भ होने से पूरे ट्री को कचरा संग्रहण से रोका जा सकेगा। डिटैच्ड डीओएम या आउट ऑफ डोम रेफरेंस का मतलब है कि नोड्स जो डोम से हटा दिए गए हैं लेकिन जेएस के माध्यम से मेमोरी में हैं। इसका मतलब यह है कि जब तक किसी चर या किसी वस्तु का संदर्भ अभी भी कहीं भी है, तब तक वह वस्तु डीओएम से हटाए जाने के बाद भी कचरा नहीं है। एक बार जब आप डोम के हिस्से के साथ काम कर लेते हैं तो हमेशा जेएस से संदर्भ हटा दें।
<मजबूत>4. घटना श्रोता
AddEventListener () विधि एक ईवेंट हैंडलर को एक तत्व से जोड़ती है और एक ही तत्व में कई ईवेंट हैंडलर जोड़े जा सकते हैं। यदि DOM तत्व और उसके ईवेंट श्रोता का जीवनचक्र समान नहीं है, तो इससे मेमोरी लीक हो सकती है।