जावास्क्रिप्ट में मेमोरी लीक हो जाती है
जावास्क्रिप्ट को कचरा एकत्रित भाषा कहा जाता है, यानी जब चर घोषित किए जाते हैं, तो यह स्वचालित रूप से उन्हें स्मृति आवंटित करेगा। जब घोषित चर के लिए कोई और संदर्भ नहीं हैं, तो आवंटित स्मृति जारी की जाएगी। स्मृति रिसाव या स्मृति से संबंधित अधिकांश समस्याएं स्मृति को जारी करते समय उत्पन्न होंगी।
कुछ सामान्य JavaScript लीक
1) आकस्मिक वैश्विक चर
जब एक अघोषित चर का संदर्भ दिया जाता है, तो जावास्क्रिप्ट वैश्विक वस्तु में एक नया चर बनाता है। निम्नलिखित उदाहरण -1 में मान लें कि भाषाओं का उद्देश्य केवल "myArray" फ़ंक्शन में एक चर का संदर्भ देना है। यदि हम इसे घोषित करने के लिए var का उपयोग नहीं करते हैं तो एक वैश्विक चर बनाया जाएगा। यह ज्यादा नुकसान नहीं कर सकता है, लेकिन मुख्य समस्या तब उत्पन्न होती है जब गलती से "इस" कीवर्ड का उपयोग करके एक वैश्विक चर बनाया जाता है जैसा कि उदाहरण -2 में दिखाया गया है।
उदाहरण-1
function myArray(arg) { languages = "[javascript,.....]"; // created using window }
उदाहरण-2
function myArray(arg) { this.languages = "[javascript,.....]"; // global object }
चूंकि, वैश्विक चर का दायरा कभी समाप्त नहीं होता है, वे पृष्ठ के निष्पादन के दौरान स्मृति में रहते हैं, भले ही उनकी आवश्यकता न हो। यह परिदृश्य कचरा संग्रहकर्ता बनाता है, जो एक स्मृति रिसाव (अप्रयुक्त) बनाने के लिए एक चर गुंजाइश समाप्त होने पर गतिशील स्मृति को हटा देता है। स्मृति में शेष वस्तुएं)। जितने अधिक वैश्विक चर, उतनी ही अधिक स्मृति रिसाव।
2) क्लोजर
क्लोजर एक आंतरिक फ़ंक्शन है जो बाहरी फ़ंक्शन के चर (दायरे) तक पहुंच सकता है। साथ ही, बाहरी फ़ंक्शन के निष्पादित होने के बाद भी आंतरिक फ़ंक्शन को बाहरी फ़ंक्शन के दायरे तक पहुंच प्राप्त होती रहेगी। एक मेमोरी लीक तब होती है जब एक घोषित चर स्वचालित रूप से आंतरिक नेस्टेड फ़ंक्शन के लिए उपलब्ध होता है और मेमोरी में रहता है, भले ही इसका संदर्भ नहीं दिया गया हो। आंतरिक नेस्टेड समारोह।
नीचे दिए गए उदाहरण में, चूंकि क्लोजर में सभी आंतरिक फ़ंक्शन समान संदर्भ साझा करते हैं, innFun() उसी संदर्भ को "फ़ंक्शन() {}" के रूप में साझा करता है जो बाहरी फ़ंक्शन द्वारा वापस किया जाता है। अब, प्रत्येक 3ms के लिए हम outFun को एक फ़ंक्शन कॉल करते हैं, एक नया मान (प्रत्येक कॉल के बाद) एक वैश्विक चर newvalue को असाइन किया जाता है। जब तक कोई संदर्भ इस "फ़ंक्शन () {}" को इंगित कर रहा है, साझा दायरा बनाए रखा जाता है और सरणी रखी जाती है क्योंकि यह आंतरिक फ़ंक्शन (innFun) का हिस्सा है, भले ही आंतरिक फ़ंक्शन को कभी नहीं कहा जाता है। हर बार जब हम बाहरी फ़ंक्शन (आउटफन) कहते हैं, तो हम पिछले फ़ंक्शन () {} को नए फ़ंक्शन के मान (चर) में सहेजते हैं। इसलिए, पहले से साझा किए गए दायरे को फिर से रखना होगा। तो बाहरी फ़ंक्शन (आउटफन) के nth कॉल में, बाहरी के (n-1) वें कॉल की सरणी कचरा एकत्र नहीं किया जा सकता है। स्मृति के अंत में समाप्त होने के बाद यह प्रक्रिया बंद हो जाती है।
उदाहरण
var newvalue; function outFun() { var array = new Array(1000000); var value = newvalue; function innFun() { if (value) return array; } return function () {}; } setInterval(function () { newvalue = outFun(); }, 3);