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

जावास्क्रिप्ट में मेमोरी लीक के बारे में विस्तार से बताएं?

<घंटा/>

जावास्क्रिप्ट में मेमोरी लीक हो जाती है

जावास्क्रिप्ट को कचरा एकत्रित भाषा कहा जाता है, यानी जब चर घोषित किए जाते हैं, तो यह स्वचालित रूप से उन्हें स्मृति आवंटित करेगा। जब घोषित चर के लिए कोई और संदर्भ नहीं हैं, तो आवंटित स्मृति जारी की जाएगी। स्मृति रिसाव या स्मृति से संबंधित अधिकांश समस्याएं स्मृति को जारी करते समय उत्पन्न होंगी।

कुछ सामान्य 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);

  1. जावास्क्रिप्ट में फंक्शन प्रोटोटाइप

    जावास्क्रिप्ट में बनाए गए कार्यों में हमेशा जावास्क्रिप्टइंजिन द्वारा जोड़ा गया प्रोटोटाइप गुण होता है। प्रोटोटाइप प्रॉपर्टी एक ऑब्जेक्ट है जिसमें डिफ़ॉल्ट रूप से कंस्ट्रक्टर प्रॉपर्टी होती है। फंक्शन प्रोटोटाइप को − . द्वारा एक्सेस किया जा सकता है functionName.prototype जब फ़ंक्शन कंस्ट्रक्टर का उ

  1. जावास्क्रिप्ट में 'नॉट ए कंस्ट्रक्टर फंक्शन' त्रुटि की व्याख्या करें?

    नॉट ए कंस्ट्रक्टर फ़ंक्शन त्रुटि तब होती है जब हम किसी ऑब्जेक्ट या वेरिएबल का उपयोग कंस्ट्रक्टर के रूप में करते हैं जो कंस्ट्रक्टर नहीं है। जावास्क्रिप्ट में नॉट कंस्ट्रक्टर फंक्शन एरर के लिए कोड निम्नलिखित है - उदाहरण दस्तावेज़ बॉडी { फॉन्ट-फ़ैमिली:सेगो यूआई, ताहोमा, जिनेवा, वर्दाना, सेन्स-सेरिफ़;

  1. जावास्क्रिप्ट में फंक्शन उधार।

    जावास्क्रिप्ट में विधियों को उधार लेने के लिए कॉल (), लागू () और बाइंड () का उपयोग किया जाता है। जावास्क्रिप्ट में उधार लेने के तरीकों के लिए कोड निम्नलिखित है - उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="v