2011-08-04 17 views
7

मैंने अभी देखा है कि कुछ जावास्क्रिप्ट मैंने लिखा है कि स्मृति को लीक करना प्रतीत होता है, यह कोड का एक साधारण टुकड़ा है - jquery के लिए धन्यवाद - लेकिन मैं इसे टास्कमैनर में चल रहा हूं और स्मृति उपयोग है धीरे-धीरे 4 और 40 बाइट्स के बीच क्लिक करके।जावास्क्रिप्ट मेमोरी लीक

$(document).ready(function() { 
    var olddata = ""; 
    window.setInterval(function() { 
     var options = JSON.stringify({ 
      orderby: "name" 
     }); 
     var params = { 
      options: options, 
      data: olddata ? JSON.stringify(olddata) : "" 
     }; 
     $.getJSON("/Home/GetTasks", params, function (json) { 
      olddata = json; 
      json = null; 
     }); 
     params = null; 
     options = null; 
    }, 1000); 
}); 

मैं सिर्फ और अधिक आसानी से समस्या को देखने के लिए टाइमर मूल्य को छोड़ दिया है:

सभी मैं कर रहा हूँ getJSON के माध्यम से एक एएसपी MVC नियंत्रक/कार्रवाई पर कुछ डेटा फेंक है

। मैं स्पष्ट रूप से कुछ गलत कर रहा हूं लेकिन क्या नहीं देख सकता।

क्या मुझे getJSON कॉल की सफाई करनी चाहिए?

टीआईए।

+0

मैं वर्तमान में एक समान परीक्षण कर रहा हूं। मेरे पास एक साधारण HTML पृष्ठ है जो XHR कॉल को किसी अन्य HTML पृष्ठ पर बनाता है। यह कोई अन्य प्रसंस्करण, डीओएम हेरफेर या किसी भी स्क्रिप्टिंग नहीं करता है। जो मैंने पाया है वह एक्सएचआर कॉल कर रहा है जिससे स्मृति रिसाव हो जाती है। क्रोम बहुत कम ले जाता है, आईई कम और एफएफ बस खून बह रहा है। नीचे की ओर, अजाक्स करने से ब्राउज़र में स्मृति पदचिह्न में छोटी वृद्धि होगी। – Mrchief

+1

एक चीज जिसे आप यहां सुधार सकते हैं, इनलाइन फ़ंक्शन को 'setInterval' से बाहर ले जाना है। इसे परिभाषित करें और इसके बजाय 'हैंडलर' में अपने हैंडलर का उपयोग करें। यह कुछ हद तक रिसाव को कम करने में मदद करेगा। – Mrchief

+0

आप अंतराल की आग हर बार पैरा और विकल्पों को फिर से परिभाषित करना बंद कर सकते हैं। – sciritai

उत्तर

6

आप कैसे जानते हैं कि आप वास्तव में स्मृति लीक कर रहे हैं?

4 और 40 बाइट्स जैसी छोटी संख्याओं पर, आप केवल ढेर वृद्धि देख सकते हैं, लेकिन ढेर में कुछ नए ब्लॉक "मुक्त" हैं और भविष्य के उपयोग के लिए उपलब्ध हैं, जबकि समग्र ऐप मेमोरी उपयोग बढ़ता है, स्मृति वास्तव में लीक नहीं है और भविष्य के उपयोग के लिए उपलब्ध होगा ताकि यह हमेशा के लिए नहीं बढ़ेगा।

यदि यह आपके प्रयोग की पूरी सीमा है, तो मुझे कोड के साथ कोई समस्या नहीं दिखाई देती है।

यहां तीन कार्य बंद हैं। $(document).ready() बंद आपके कोड के जीवनकाल को जारी रखता है, लेकिन यह केवल एक बार का सौदा है इसलिए कोई मुद्दा नहीं होना चाहिए।

अज्ञात फ़ंक्शन setInterval() पर $(document).ready() जीवित बंद रहता है। setInterval() पर प्रत्येक कॉल को एक नया कॉल होना चाहिए जो स्थानीय चर का एक नया सेट प्राप्त करेगी और पूर्व कॉल को पूरा होने पर पुराने लोगों को छोड़ दें।

गुमनाम समारोह getJSON() के लिए पारित setInterval गुमनाम समारोह पर एक बंद बनाता है, लेकिन है कि बंद के केवल पिछले getJSON समारोह खत्म और जब यह होता है setInterval() गुमनाम समारोह बंद जारी की जानी चाहिए जब तक करना चाहिए।

एकमात्र बंद जो मैं देखता हूं वह यहां रहता है $(document).ready() बंद है जो आप चाहते हैं और यह केवल एक बार बनाया गया है, इसलिए इसे कोई रिसाव नहीं होना चाहिए।

GetJSON अज्ञात फ़ंक्शन में सभी स्थानीय चर इसे समाप्त होने पर रिलीज़ होने जा रहे हैं। getJSON कॉल कि बचता से केवल डेटा के अपने काम है:

olddata = json; 

लेकिन, बाद एक काम सिर्फ इसलिए पिछले डेटा नहीं रह गया है कचरा द्वारा संदर्भित और रीसाइक्लिंग के लिए उपलब्ध है पिछले कॉल से डेटा को बदल रहा है एकत्र करनेवाला।

यहां कोई डोम मैनिप्लेशंस नहीं है इसलिए डोम और जेएस के बीच क्रॉस या सर्कुलर संदर्भों का कोई अवसर नहीं है।

मेरा निष्कर्ष यह है कि मुझे कुछ भी नहीं दिखता है जो रिसाव होगा। मैं अस्थायी स्मृति का उपयोग करके बहुत सी चीजें देखता हूं इसलिए मुझे संदेह है कि आप प्रक्रिया में क्या देख रहे हैं स्मृति उपयोग केवल ढेर वृद्धि है, लेकिन इस तरह से वृद्धि हुई है कि उगाई गई स्मृति अंततः पुन: उपयोग की जाएगी। यदि ब्राउज़र जेएसओएन परिणामों को भी कैश कर रहा है, तो आप मेमोरी कैश ग्रोथ भी देख सकते हैं।

दुर्भाग्यवश, आज के ब्राउज़र में, यह कहना मुश्किल है कि यह वास्तव में एक स्मृति रिसाव है जब कैशिंग, सामान्य ढेर इत्यादि द्वारा उपयोग की जाने वाली ब्राउज़र मेमोरी का एक अस्थायी विस्तार बनाम है ... चरम पर, आप सभी कैश को बहुत सेट कर सकते हैं छोटा और इसे लंबे समय तक चलाएं (हजारों पुनरावृत्तियों)। यदि यह रिसाव नहीं है, तो स्मृति उपयोग अंततः बाहर निकलना चाहिए। यदि यह एक रिसाव है, तो स्मृति उपयोग अपेक्षाकृत रैखिक रूप से बढ़ना जारी रखना चाहिए।

अस्वीकरण: यहाँ त्याग है कि मैं यह सोचते हैं रहा है कि jQuery समारोह $.getJSON() खुद लीक नहीं करता है और हमेशा एक तरीका है कि बंद यह बनाता है को साफ में खत्म, भले ही ajax कॉल सफल नहीं है ।

संबंधित मुद्दे