2012-03-24 27 views
13

मुझे काफी यकीन है कि मुझे केओ संस्करण 2.0 का उपयोग कर मेमोरी लीक मिल रहा है। मेरे पास एक अवलोकन योग्य सरणी है जो AJAX कॉल के परिणामस्वरूप आबादी में है। यह संग्रह एक डीआईवी कंटेनर के लिए प्रत्येक के साथ डेटा-बाध्य है। सरणी में प्रत्येक ऑब्जेक्ट में एक एकल अवलोकन योग्य मान होता है जो चेकबॉक्स से जुड़ा होता है। मैंने क्रोम का उपयोग करके ढेर की जांच की है और मेरा निष्कर्ष निम्नलिखित है:नॉकआउट जेएस मेमोरी लीक

यदि AJAX कॉल 3 तत्व लौटाता है, तो उन्हें DOM पर ठीक से प्रस्तुत किया जाता है। अगर मैं इस बिंदु पर ढेर का स्नैपशॉट लेता हूं, तो वहाँ तीन SearchResult ऑब्जेक्ट्स हैं। अगर मैं फिर से AJAX कॉल को ट्रिगर करता हूं और यह 5 तत्व देता है, तो सभी 5 सही ढंग से DOM को प्रस्तुत किए जाते हैं। हालांकि, अगर मैं क्रोम में ढेर का एक स्नैपशॉट लेता हूं, और उनकी तुलना करता हूं, तो अभी भी ढेर पर मौजूद 8 तत्व सूचीबद्ध हैं, उनमें से सभी को "जोड़ा गया" के रूप में सूचीबद्ध किया गया है और कोई भी "हटाया गया" के रूप में सूचीबद्ध नहीं है। डीओएम डिस्प्ले हमेशा सही होता है, लेकिन मेमोरी का उपयोग केवल चढ़ाई और चढ़ाई करता रहता है क्योंकि पुराने खोज परिणामों को कभी भी हटाया नहीं जाता है।

क्या कोई मेरी मदद कर सकता है या मुझे स्मृति रिसाव का निदान करने के लिए पॉइंटर्स दे सकता है?

अद्यतन

मैं एक jsFiddle बना लिया है कि मैं क्या कर रहा हूँ का सार दिखाने के लिए। मैंने सब कुछ दबा दिया है लेकिन मूल कार्यक्षमता और मैं अभी भी अपनी स्थानीय मशीन पर चलते समय मेमोरी रिसाव को डुप्लिकेट कर सकता हूं। स्पष्ट रूप से यह कोड काम नहीं करेगा क्योंकि यह पोस्ट किया गया है क्योंकि इसे खोज चलाने के लिए मेरे स्थानीय सर्वर को हिट करने की आवश्यकता है।

अद्यतन 2

मैं नवीनतम 2.1.0.0 बीटा संस्करण खींच लिया और रिसाव गायब हो गया। मैं चीज़ों के बीटा संस्करण या क्लासिक "बस नए संस्करण में अपग्रेड" फिक्स का उपयोग करने का एक बड़ा प्रशंसक नहीं हूं। मुझे अभी भी यह जानने में बहुत दिलचस्पी है कि क्या बदल गया है या मैं क्या गलत कर रहा था जो रिसाव बना रहा था।

+2

में तय किया गया है कि यह वास्तव में जब तक यह स्मृति से बाहर चलाता जा रहा रखता है? जेएस इंजन कचरा चीजें तुरंत इकट्ठा नहीं करेंगे, तो आप जो देख रहे हैं वह इंजन ही जीसी नहीं कर सकता है क्योंकि इसमें अभी भी बहुत सारी यादें बाकी हैं। –

+0

मैंने 450 एमबी के ऊपर का उपयोग करके अपनी साइट देखी है। क्या इंजन ओएस द्वारा निर्धारित आवंटित करने के लिए कोई बाएं नहीं होने तक अधिक से अधिक स्मृति का उपयोग नहीं करेगा? इसका मतलब यह नहीं होगा कि ओएस कंप्यूटर को क्रैश होने तक अधिक से अधिक स्मृति का उपयोग जारी रखने देगा? मैं यह देखने के लिए कैसे परीक्षण करूंगा कि यह स्मृति से बाहर हो गया है या नहीं? – arb

+0

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

उत्तर

10

आप कुछ भी गलत नहीं कर रहे हैं, ऐसा लगता है ko.cleanNode तरह foreach बाइंडिंग अनदेखी कर रहा था और ठीक से अपडेट observableArray भीतर पुरानी वस्तुओं के निपटान नहीं।

https://github.com/SteveSanderson/knockout/issues/271

यह 2.1.0beta

+3

'[संदर्भ में देखें] [https://github.com/SteveSanderson/ नॉकआउट/मुद्दे/271) बंद कर दिया गया था क्योंकि संवाददाता नॉकआउट गलत का उपयोग कर रहा था। किसी को एक ही डोम नोड पर एक से अधिक बार लागू नहीं करना चाहिए()। – GregT

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