2017-08-11 29 views
8

क्रोम नवीनतम और अन्य ब्राउज़रों में परीक्षण किया गया। यह पृष्ठ प्रत्येक 60 सेकंड रीफ्रेश करने के लिए timer() प्रारंभ करता है। init() और प्रत्येक refresh() पर, यह सर्वर से डेटा प्राप्त करता है और पृष्ठ में प्रदर्शित होता है। हम देखते हैं कि यह प्रत्येक ताज़ा एमबी के बहुत सारे एमबी लीक करता है।angularjs 1.5: लीक होने और रिसाव को ठीक करने की पहचान कैसे करें?

  1. अब, मैं कैसे विशिष्ट वस्तुओं और/या DOM नोड्स कि लीक किया जा रहा है

  2. की पहचान है एक बार मैं # 1 से वस्तु/नोड्स की पहचान, मैं लीक फिक्सिंग के बारे में कैसे जाते हैं?

क्या कोई किताबें, अच्छे ट्यूटोरियल हैं जो उपरोक्त 1.5 के लिए उपरोक्त को कवर करेंगे?

+1

एक अच्छी शुरुआत आपके डेवलपर टूल (या नए क्रोम संस्करणों में मेमोरी) में प्रोफाइलर को आजमा रही है। –

+0

मुझे इसे काम करने के लिए और अधिक जानकारी चाहिए। मैं क्रोम देव टूल्स का उपयोग कर मेमोरी लीक कैसे ढूंढूं "के लिए गुगल किया और अलग डीओएम ऑब्जेक्ट्स की पहचान करने में सक्षम था। लेकिन वहां से, मैं कुछ भी ठोस नहीं हो सका। – anjanb

उत्तर

1

आपको शायद https://developers.google.com/web/tools/chrome-devtools/memory-problems/ और http://www.dwmkerr.com/fixing-memory-leaks-in-angularjs-applications/ मिले क्योंकि वहां कोई और विस्तृत संसाधन नहीं है।

एक डोम नोड केवल कचरा एकत्र किया जा सकता है जब वहाँ या तो पेज के डोम पेड़ या जावास्क्रिप्ट कोड से यह करने के लिए कोई संदर्भ हैं। एक नोड को "अलग" कहा जाता है जब इसे डीओएम पेड़ से निकाल दिया जाता है लेकिन कुछ जावास्क्रिप्ट अभी भी इसका संदर्भ देता है। अलग डोम नोड्स स्मृति रिसाव का एक आम कारण हैं।

  1. आप टाइमर के संदर्भ पकड़े नहीं कर रहे हैं लेकिन हर ताज़ा करने पर एक नया घड़ी बनाने - रिसाव, $timeout

  2. चेकआउट पुन: उपयोग से व्याख्या करने योग्य - CTRL + F $scope is retained by a context for a closure. पर दूसरा प्रदान किया गया लिंक। उपयोग के मामले में बताया गया है कि आपके पास ऐसा ही है। इसके अलावा पर लेख में:

हम समारोह खोलने के लिए और मुद्दों के लिए यह जांच कर सकते हैं। एक $ http.get है जो बंद होने के रूप में है जो $ स्कोप का उपयोग करता है, लेकिन खतरनाक रूप से प्रत्येक 10 सेकंड चलाने के लिए पंजीकृत एक $ अंतराल है, जिसे कभी अपंजीकृत नहीं किया जाता है। अंतराल कॉलबैक एक और $ http.get का उपयोग करता है, जिसमें $ स्कोप का उपयोग बंद हो जाता है। यही समस्या है।

उपरोक्त में से कोई तो लागू होता है यहाँ memory leak एक कीवर्ड के रूप होने AngularJS में खुला समस्याओं की सूची है:

https://github.com/angular/angular.js/issues?utf8=%E2%9C%93&q=is%3Aopen%20memory%20leak

1

मुझे यकीन है कि अगर यह तुम नहीं हो (मदद मिलेगी नहीं कर रहा हूँ शायद आप इसे पहले ही देख चुके हैं), लेकिन यह उल्लेख करने लायक है। मेरे पिछले एप्लिकेशन के साथ एक समान समस्या थी जहां हर AJAX अनुरोध के दौरान वस्तुओं को लगातार डुप्लिकेट किया जा रहा था। तो पेज के लोड से मैं लगभग 50 एमबी मेमोरी का उपयोग कर रहा हूं, लेकिन 10-15 अजाक्स कॉल करने के बाद मेमोरी आकाश रॉकेट को> 1 जीबी तक पहुंचाएगी।

मैं क्रोम देव उपकरण -> मेमोरी टैब का उपयोग कर समस्या को पहचानने और हल करने में सक्षम था। यहां से आप स्मृति की आवंटन प्रोफाइल रिकॉर्ड कर सकते हैं और एक हीप स्नैपशॉट प्राप्त कर सकते हैं। तो, आपकी स्थिति के लिए मैं टाइमर को परीक्षण उद्देश्यों के लिए 5 या 10 सेकंड तक काट सकता हूं, फिर इन प्रोफाइलरों को चलाएं।आप किस तरीके से बुलाए जा रहे हैं और किस कीमत पर विचार कर पाएंगे।

उम्मीद है कि इससे मदद मिलती है।

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