2014-04-25 10 views
8

चिंता करना कब शुरू करना चाहिए, इसलिए मेरे पास कोणीय, घोंसला वाले राज्यों, बहुत सारे निर्देश, डेटा टेबल और सामान पर निर्मित यह बड़ा अनुप्रयोग है।Angular.js मेमोरी लीक, मुझे

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

तो मैंने यह देखने के लिए तीन स्नैपशॉट तकनीक के साथ शुरुआत की। लेकिन मुझे पूरी तरह से यकीन नहीं है कि इसे क्या बनाना है।

IMAGE enter image description here

  • स्नैपशॉट आकार इसके आकार प्रत्येक स्नैपशॉट लिया (1 15mb, 2 67mb, 3 120mb) दोगुना हो जाता है, यह कुछ भी मतलब है?
  • वहाँ लाल डोम, उदाहरण के

अब के लिए लाल divs मुझे लगता है कि उन लाल divs, फैला और एंकर मुख्य रूप से मेरी गलती कर रहे हैं की 4000 की एक बहुत कुछ है, मैं करने के लिए कुछ नहीं-तो-सामान्य सामान कर रहा हूँ मैंने जो निर्देश दिया है, उसका उपयोग करके उन डेटा तालिकाओं को प्रस्तुत करें, और मुझे यह भी लगता है कि कुछ ढेर ऑब्जेक्ट्स उन डोम तत्वों का परिणाम हैं जिन्हें ठीक से हटाया नहीं जा रहा है।

यह वही तालिका निर्देश अनिवार्य रूप से करता है

var rows = '<div class="row" ng-repeat="item in items">'; 

_.each(columns, function(column) { 
    // pass cell as a string from $templateCache, instead of having <table-cell type="column.type"> which loaded correct templateUrl depending on what was passed via type attr 
    var cellTemplate = $templateCache.get(column.type); 
    rows += '<div class="column">' + cellTemplate + '</div>'; 
}); 

rows += '</div>'; 

// el is from directive link function 
el.html(rows); 

$compile(el.contents())(scope); 

कारण कारण है कि मैं इस सब पर कर रहा हूँ है क्योंकि जब मैं पंक्तियों और स्तंभों और कोशिकाओं के लिए <table-cell> निर्देश के लिए ng-repeat नेस्ट का उपयोग करने की कोशिश की है, यह रास्ता ले लिया है प्रस्तुत करने में बहुत लंबा, यहां तक ​​कि केवल 6 कॉलम और 50 पंक्तियों के साथ।

तो मुझे लगता है कि यह हो रहा है कि इस तालिका के अंदर उन divs में से कोई भी सही ढंग से हटा दिया जाता है ताकि वे इस तालिका निर्देश भार को हर बार ढेर रख सकें।

अब भी अगर मैं उस अलग डोम पेड़ से निपटता हूं .. अन्य सभी चीजों के बारे में क्या, मुझे कैसे पता चलेगा कि मुझे किस कोशिश करनी चाहिए और इससे निपटना चाहिए, और जो कोणीय के लिए सामान्य हैं और वास्तव में प्रदर्शन को प्रभावित नहीं करते हैं? plunker http://plnkr.co/edit/1fZi6mVn2jBIGF0Q2a40?p=preview

+0

किसी भी संदर्भ के बिना हम अंधेरे से एक फिक्स की सिफारिश नहीं कर सकते हैं। एक स्क्रीनशॉट यह नहीं बताता कि वास्तव में क्या चल रहा है। क्या आप कुछ प्रासंगिक कोड पोस्ट कर सकते हैं? – Nix

+0

प्रश्न संपादित किया गया, बात यह है कि, मुझे पूरी तरह से यकीन नहीं है कि कोड का यह टुकड़ा यह कारण है .. – foxx

+0

इसे निर्देश क्यों होना चाहिए?क्या आप दिखा सकते हैं कि आप इसका उपयोग कहां करते हैं? – Nix

उत्तर

5

रिसाव वास्तव में किसी अन्य, पूरी तरह से हानिरहित दिखने वाले निर्देश के कारण था जो तालिका के शीर्षलेख में उपयोग किया गया था और कुछ भी नहीं कर रहा था, लेकिन "सॉर्ट आइटम" की सरणी बना रहा था और फिर इसे ng-repeat का उपयोग करके प्रिंट कर रहा था .. और इससे भी बदतर यह उस निर्देश के अंदर मैंने जो कुछ भी किया था, उसके कारण नहीं था, लेकिन इसकेreplace: true .. भगवान जानता है क्यों, मैं इसे प्लंकर पर कोशिश करता हूं और पुन: पेश करता हूं और गिथब पर रिपोर्ट करता हूं।

चूंकि यह पता लगाना लगभग असंभव था कि ऐप का कौन सा हिस्सा केवल ढेर रिपोर्ट को देखकर उत्पन्न हुआ था, इसलिए मैंने ऐप के अन्य सभी हिस्सों को हटा दिया और हटा दिया लेकिन मुझे संदेह था कि मुझे इसका कारण बन रहा था, फिर मैंने पाया बाहर यह एक नहीं था, इसलिए मैं चला गया और सभी को पढ़ा रखा।

एक बार जब मुझे वास्तविक समस्याग्रस्त निर्देश मिल गया, तो मैंने वही किया, जब तक कि सचमुच अंदर कुछ भी नहीं था, तब तक उसके कोड के हिस्सों को हटा दिया गया।

तब यह स्पष्ट था कि यह निर्देशक विकल्पों में से एक था, तो मुझे पता चला कि प्रतिस्थापन इसे उत्पन्न कर रहा था।

4

यही निर्देश कुछ भी लीक नहीं किया गया है पर

// संपादित तालिका निर्देश। मैंने आपके plnkr को फोर्क किया, अगर इसे लीक कर दिया गया तो उसे नोटिस करने के लिए और अधिक ऑब्जेक्ट्स जोड़ा गया, और एक बटन जोड़ा जो तालिका को फिर से लोड करता है। यह एक सेकंड इंतजार करता है और फिर इसे फिर से पॉप्युलेट करता है।

नोड्स को समाप्त कर दिया गया है और फिर से बनाया गया है।

  • कि वास्तव में कर 10 सेकंड
  • बंद करो रिकॉर्डिंग
  • रुको

    • प्रारंभ रिकॉर्डिंग
    • प्रतीक्षा 2 सेकंड
    • बटन दबाएं: चरणों लीक कर रहे हैं पता लगाने के लिए प्रयास करने के लिए 3 बार (इसलिए आपके पास स्मृति की एक ही स्थिति है), आप देखेंगे कि एक ही मेमोरी का उपयोग किया जा रहा है:

      enter image description here

      आप देख सकते हैं काँटेदार plnkr

      इस के बाद, मैं केवल अनुमान लगा है कि क्या समस्या हो सकती है की कोशिश कर सकते हैं। मैं आपको here की खोज के आधार पर आपको कुछ सुझाव देने जा रहा हूं।

      • निर्देशों की जांच करें, वे आमतौर पर कारण हैं। frickingTable ऐसा कुछ भी हानिकारक प्रतीत नहीं होता है, लेकिन अन्य रीति-रिवाज वाले लोग भी हो सकते हैं, भले ही वे आपकी न हों, तो बस होता है।
      • यदि तालिका किसी प्रकार के "मतदान" के साथ पॉप्युलेट की जा रही है, तो पुन: असाइन करने से पहले ऑब्जेक्ट को खाली करें। इसलिए, यदि आप फोर्कड plnkr देखते हैं, तो आप देखेंगे कि मैंने पहले items को null पर रखा और फिर असाइन किया। वह रास्ता होना चाहिए। Plnkr में मैंने इसे ध्यान देने योग्य किया (कि तालिका फिर से आबादी जा रही है) हालांकि, मुझे पता चला है कि यदि आप ऑब्जेक्ट/एरे साफ़ नहीं करते हैं तो ब्राउज़रों को किसी भी तरह संदर्भ रखना पड़ता है। मैं .length = 0 और null के साथ ऑब्जेक्ट साफ़ करता हूं, जो उस ऑब्जेक्ट के सभी संभव संदर्भों को जीसीड होने के लिए तैयार करता है और किसी भी रिसाव का कारण नहीं बनता है। यह मूर्खतापूर्ण लगता है, लेकिन मैंने इसे कोणीय में और बैकबोन में भी देखा है, इसलिए इसे ब्राउज़र की बात होनी चाहिए।

      मैं वास्तव में किसी और कोड को देखे बिना किसी और चीज के बारे में सोच नहीं सकता। उम्मीद है कि यह आपको सही दिशा में इंगित करता है, कम से कम कहने के लिए लीक परेशान हैं।

    +0

    पेज पर सचमुच कुछ और नहीं है जहां मैं यह देख रहा हूं। ऐसा कुछ भी नहीं है जो उन पृष्ठों पर नहीं है जहां यह वैसे भी नहीं हो रहा है। मेरे द्वारा पोस्ट किए गए निर्देश कोड और वास्तव में उपयोग किए जाने वाले एकमात्र अंतर यह है कि डेटा लोड होने के बाद ही रूपांतरण होता है, और यह दायरे के माध्यम से किया जाता है। $() .. उन "मृत" नोड्स की संख्या कुछ हद तक तालिका में divs की संख्या से मेल खाती है (गुणा करके राज्यों/निर्देशों को कितनी बार लोड किया जाता है) .. मुझे नहीं पता। – foxx

    +0

    ऐसा लगता है कि आप कई बार बाध्यकारी हो सकते हैं और इससे समस्या उत्पन्न हो सकती है। यदि आप प्लंकर अपडेट कर सकते हैं या असली ऐप दिखा सकते हैं जो उपयोगी होगा! –

    +0

    वैसे मैं बाइंडोन्स का उपयोग कर रहा हूं (इसे हटाने से समस्या बीटीडब्ल्यू ठीक नहीं होती है), इसलिए वास्तव में कोई बाध्यकारी नहीं है (दो तरह से है)। और जैसा कि मैंने कहा, केवल अंतर यह है कि मेरे ऐप में $ संकलन डेटा उपलब्ध होने के बाद ही चलता है, जैसे http://plnkr.co/edit/AgEY9DFpDBjPZQG1de2u?p=preview – foxx

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