2012-10-10 12 views
5

मैंने हाल ही में this tutorial में पढ़ा है कि कुछ jQuery लीक $.cache चर के माध्यम से ट्रैक करने योग्य हैं, और यदि आप बहुत बड़े हैं, तो आप हमेशा कुछ गलत कर रहे हैं, तो आप हमेशा इसका आकार जांचना चाहिए।

अच्छा, कितना बड़ा बड़ा है? क्या यह देखने के लिए एक चर का निरीक्षण करने का कोई तरीका है कि यह कितनी मेमोरी खा रहा है?

मैं ऐसी वेबसाइट पर काम कर रहा हूं जो केवल होमपेज लोड करके 210 ऑब्जेक्ट्स को कैश करता है। क्या यह बहुत ज्यादा है? मैं इस मुद्दे के बारे में पूरी तरह से स्पष्टीकरण की सराहना करता हूं।

+0

यह के बारे में कितनी बड़ी बात है नहीं है, लेकिन कैसे यह समय के साथ बढ़ता है। यदि कैश बाध्य नहीं है (यानी हमेशा के लिए बढ़ता है) तो आपको शायद मेमोरी रिसाव मिल गया है। –

+1

jQuery वास्तव में ब्राउज़र संगत है। यह सभी ब्राउज़रों के लिए तत्वों का सही ढंग से निपटान करने की आईई समस्या लाता है। –

+0

यदि आप समझदार हैं तो आपको आधुनिक मेमोरी क्षमताओं को तनाव देने के लिए कड़ी मेहनत की जाएगी। बेशक आप एक बड़ी पर्याप्त स्मृति रिसाव बनाते हैं। स्मृति की कोई जादू राशि नहीं है, यह सब उपयोगकर्ता के हार्डवेयर पर निर्भर करता है। क्या आप 90 के दशक से कंप्यूटर का उपयोग करने वाले लोगों की परवाह करते हैं? –

उत्तर

3

$.cache चेहरे के मूल्य पर आकार मेमोरी लीक के बारे में कुछ भी नहीं बताता है। यह बहुत छोटा हो सकता है और अभी भी एक स्मृति रिसाव हो सकता है, या यह बहुत बड़ा हो सकता है और कोई स्मृति रिसाव नहीं है।

यदि आपको पता है कि आपके पास एक समय में पृष्ठ पर jQuery के साथ 10 ईवेंट श्रोताओं के साथ बाध्य है, और अभी तक $.cache में अधिक प्रविष्टियां हैं, तो आप जानते हैं कि आप लीक कर रहे हैं।

ईवेंट श्रोताओं को प्रत्येक व्यक्तिगत तत्व को जोड़ने के बजाय ईवेंट प्रतिनिधिमंडल का उपयोग करना एक विशाल मेमोरी सेवर है।

कहते हैं:

<ul> 
    <li></li> 
    <li></li> 
    <li></li> 
</ul> 

$("li").on("click", fn) 3 अलग-अलग ईवेंट हैंडलर्स (अधिक, अगर आप अधिक है ली का निश्चित रूप से), जबकि $("ul").on("click", "li", fn) आप कितने ली-तत्व की परवाह किए बिना सिर्फ एक देते हैं और अभी तक होता है देते हैं एक ही परिणाम। रिसाव की


उदाहरण:

$("button").click(function() { 
    $("#target")[0].innerHTML = ""; 
    $("<div>").appendTo($("#target")).click($.noop); 
    $("#log").text(Object.keys($.cache).length); 
});​ 

http://jsfiddle.net/SGZW4/1/

कारण किया जा रहा है कि .innerHTML जो jQuery का हिस्सा नहीं है तो यह साफ नहीं कर सकते हैं प्रयोग किया जाता है,।

फिक्स उसी के लिए jQuery विधि का उपयोग करने के लिए है:

$("button").click(function() { 
    $("#target").html(""); 
    $("<div>").appendTo($("#target")).click($.noop); 
    $("#log").text(Object.keys($.cache).length); 
});​ 

http://jsfiddle.net/SGZW4/2/

+0

यह एक अच्छी टिप है। लेकिन मैं अपने मेमोरी उपयोग का बेहतर निरीक्षण करने के लिए $ .cache चर का उपयोग कैसे कर सकता हूं? एक उदाहरण मैंने अभी सोचा था: कैश किए गए तत्वों की संख्या की जांच करें, एक बटन पर क्लिक करें और अपेक्षित दृश्य व्यवहार करें, फिर से कैश किए गए तत्वों की संख्या की जांच करें, उस बटन पर क्लिक करें जो पिछली क्रिया को "रीसेट" करता है, और देखें कि कैश तत्व संख्या इस परीक्षण की शुरुआत में समान है। उदाहरण के लिए, स्मृति उपयोग का परीक्षण करने के लिए $ .cache का अच्छा उपयोग है? – ChuckE

+0

@ChuckE मैं $ .cache के बारे में चिंता नहीं करता, पूरी बात से बचने का एक तरीका यह है कि विशेष रूप से पहले स्थान पर कभी भी हटाए गए स्थिर तत्वों के लिए ईवेंट प्रतिनिधिमंडल का उपयोग न करें। अन्यथा बस सुनिश्चित करें कि आप हमेशा jQuery विधियों का उपयोग कर रहे हैं, न कि मानक डोम वाले: http://jsfiddle.net/SGZW4/1/ बनाम http://jsfiddle.net/SGZW4/2/ – Esailija

+0

हमम, दिलचस्प। तो इसका मतलब है, परीक्षण किए गए मामले के लिए, $। कैश भी जांच नहीं कर सकता कि स्मृति मेमोरी थी? – ChuckE

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