2011-06-25 9 views
5

मुझे पता है कि इस सवाल से पहले पूछा गया है, लेकिन कोई भी जवाब इस मुद्दे को हल करने के लिए प्रतीत नहीं होता है। मैं एक AJAX वेबपृष्ठ का परीक्षण कर रहा हूं जो जावास्क्रिप्ट के माध्यम से DOM में तत्वों को अद्यतन करता है।जावास्क्रिप्ट के माध्यम से डोम को अपडेट करना जिससे स्मृति लीक (केवल फ़ायरफ़ॉक्स में)

हर मिनट, सर्वर को नए डेटा के लिए पूछताछ की जाती है और डीओएम तदनुसार अपडेट किया जाता है। जो मैं बता सकता हूं, क्रोम में इस पृष्ठ के लिए स्मृति उपयोग बढ़ता है, लेकिन बहुत अधिक नहीं (यह लगभग 40 एमबी शुरू होता है और अधिकतम 80 एमबी तक पहुंचता है)। फ़ायरफ़ॉक्स में, हालांकि, स्मृति उपयोग लगभग 120 एमबी शुरू होता है और 400 एमबी से अधिक तक फैल सकता है। मैंने फ़ायरबग के साथ जावास्क्रिप्ट के माध्यम से कदम रखा है और ऐसा लगता है कि जब मेरी Davascript विधियों के माध्यम से डोम अपडेट किया जाता है तो स्मृति सबसे अधिक फैलता है।

var myTable = document.createElement("table"); 

var thead = document.createElement("thead"); 
var tr = document.createElement("tr"); 
var th = document.createElement("th"); 
th.appendChild(document.createTextNode("column1")); 
tr.appendChild(th); 

for(var test in obj.testObjs){ 
    th = document.createElement("th"); 
    th.appendChild(document.createTextNode(obj.testObjs[test].myVar)); 
    tr.appendChild(th); 
} 

डोम में नोड्स के लिए नए डेटा जोड़कर से पहले, मैं पहले मौजूदा डेटा साफ़:

डोम हेरफेर, जैसे सरल है। मैं सहित कई तरीकों से, की कोशिश की है कि यहाँ क्या वर्णित है: How to remove DOM elements without memory leaks?

साथ ही इस तरह के रूप में एक आसान तरीका:

function clearChildren(node){ 
    if(node != null){ 
     while (node.hasChildNodes()) node.removeChild(node.firstChild); 
    } 
} 

मैं भी पढ़ा है (Cyclic adding/removing of DOM nodes causes memory leaks in JavaScript?) ब्राउज़रों कि केवल कचरा संग्रहण प्रारंभ जब यह एक निश्चित स्तर तक पहुंचता है? क्या इसकी पुष्टि हो सकती है? मुझे लगता है कि बढ़ती हुई स्मृति के कारण मेरा पीसी थोड़ी देर बाद सुस्त चल रहा है।

मुझे लगता है कि इसका समाधान होना चाहिए, क्योंकि वाणिज्यिक साइट्स जो मैंने परीक्षण की है, वही कार्यात्मक कदम करने से स्मृति उपयोग बढ़ने का कारण नहीं बनता है।

किसी भी मदद की सराहना की जाएगी।

धन्यवाद।

उत्तर

2
innerHTML='' 

गलत तरीके से को जीसी से निपटने के लिए एक चर तैयार है।
आपको तत्व पर delete फ़ंक्शन और इस तत्व का संदर्भ देने वाले प्रत्येक तत्व का उपयोग करने की आवश्यकता है।
बहुत, सही?
यही कारण है कि हमारे पास जेएस पुस्तकालय हैं जहां यह हमारे लिए लिखा गया था। मैंने Mootools में कोड की जांच की है (इसे डाउनलोड करें और को नष्ट करें) और ऐसा लगता है कि मुझे सही ढंग से लिखा जाना है।
मुझे लगता है कि यह अन्य पुस्तकालयों में भी वही होगा।

+0

प्रतिक्रिया के लिए धन्यवाद - क्या Mootools JQuery के साथ हस्तक्षेप करता है? मैं अपनी साइट पर JQuery का उपयोग कर रहा हूं, और जब Mootools() फ़ंक्शन को नष्ट करने का प्रयास कर रहा हूं, तो मुझे एक जेएस त्रुटि मिलती है कि "नष्ट करें() एक फ़ंक्शन नहीं है" – user172092

+0

आपको इसे एक साथ खेलने के लिए सही तरीके से सेट करने की आवश्यकता है (इन मेरी साइट वे अच्छी तरह से करते हैं)। जैसे, Mootools निर्भर कोड में '$' का उपयोग करने के बजाय, आपको 'document.id ('चयनकर्ताओं ...') ' –

+0

धन्यवाद - ऐसा लगता है जैसे स्मृति उपयोग लगातार बढ़ रहा है, और मुझे कभी-कभी यह कम हो रहा है। तुम्हारी सहायता सराहनीय है। – user172092

3

क्या इसकी पुष्टि हो सकती है?

यह निर्भर करता है।

सामान्य रूप से, जब ब्राउज़र ऐसा महसूस करते हैं तो ब्राउज़र्स जीसी करेंगे, और हेरिस्टिक्स अक्सर बदल सकते हैं। मुझे संदेह है कि यदि आप रात में फ़ायरफ़ॉक्स का प्रयास करते हैं तो आप ऊपर वर्णित वर्णन से बहुत अलग व्यवहार देखेंगे। फ़ायरफ़ॉक्स 5 रिलीज के बाद से कम से कम 2 जीसी हेरिस्टिक्स परिवर्तन हुए हैं।

+0

अब हम क्या एफएफ संस्करण हैं? मैंने ट्रैक खो दिया –

+0

फ़ायरफ़ॉक्स 5 वर्तमान स्थिर रिलीज है। 6 अगस्त के मध्य के लिए निर्धारित है। –

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