2015-10-21 69 views
3

在大型Ember-CLI應用程序中,我遇到了非常嚴重的內存泄漏。我可以輕鬆地複製應用程序,使其慢慢崩潰,然後徹底崩潰。餘燼組件內存泄漏

經過大量的時間考慮性能瓶頸等(導致改進)之後,我確定我有內存泄漏。

在我試圖儘可能簡單的代碼片段儘可能通常的精神。我的結論:Ember組件在有條件的情況下會泄漏內存。

但是,我看不到任何人抱怨,所以想知道我是否忽略了某些明顯的東西?

我的測試應用程序產生完全相同的輸出,但有兩種不同的方式。在這兩種情況下,然後應用程序初始化,它創建了1000個簡單對象的數據數組,其中一個屬性是vis,它最初設置爲false。在初始延遲之後,這1000個對象的屬性在間隔爲50ms時更改爲true。

export default Ember.Controller.extend({ 

    data : [], 
    scrollTimer : null, 

    init : function() 
    { 
     var data = this.get("data"); 

     for (var x=0;x<500;x++) 
     { 
      var obj = {id:x,label:"o".repeat(10) + "_" + x,vis:false}; 

      data.push(obj); 

      obj = null; 
     } 

     Ember.run.later(this,this.make_visible,0,5000); 
    }, 

    make_visible : function(idx) 
    { 
     var data = this.get("data"); 

     Ember.set(data[idx++],"vis",true); 

     if (idx < data.length) 
     { 
      Ember.run.later(this,this.make_visible,idx,10); 
     } 
    }, 
}); 

測試1,我的應用程序模板看起來是這樣的:

{{#each data as |item index|}} 

    {{data-item item=item}} 

{{/each}} 

和數據項如下:

模板:

{{component itemComponent item=item}} 

JS:

export default Ember.Component.extend({ 

     itemComponent : function() 
     { 
      var item = this.get("item"); 

      return item.vis ? "item-visible" : "item-hidden"; 

     }.property("item.vis"), 

    }); 

項目可見和項目隱藏的只是HBS文件,靜態文本隱藏可見

所以,當它運行時,我得到1000行隱藏,這緩慢地改變,說可見。在這種情況下,數據項交換哪個組件正在輸出文本的邏輯,最初是項目隱藏的,然後是項目可見的。

Timeline snapshot from Chrome dev tools

在這裏,您可以看到所消耗的內存不斷增加。

有一個玩弄這裏:http://ember-twiddle.com/c9c3e6c5a9908bd2c438

測試2,我已經與該項目可見/項隱藏的組件和數據項分配現在直接使用內嵌條件邏輯輸出隱藏/可見文本。

{{#if item.vis}} 
     <div>visible</div> 
{{else}} 
     <div>hidden</div> 
{{/if}} 

Timeline snapshot from Chrome dev tools

這個時候內存被從時間發佈時間,我會期望。

有一種玩弄這裏:http://ember-twiddle.com/01b1abe7badea3ce3a16

所以我的問題是,爲什麼是有條件的,包括這樣導致此內存泄漏的部件?我可以採取什麼不同的方式來避免它?

在我的實際應用中我的邏輯是這樣的:

{{#if XXXXX}} 
    {{component-x}} 
{{else}} 
    {{component-y}} 
{{/if}} 

此具有相同的內存泄漏問題。

我用灰燼1.3.8(帶最新的灰燼-CLI),玩弄似乎是使用1.3.10

+0

爲什麼你不應該考慮打開一個問題[這裏](https://github.com/emberjs/ember.js/issues)? –

+1

我現在這樣做了:https://github.com/emberjs/ember.js/issues/12513 –

+0

供參考:我現在已經更新了應用程序Ember-CLI 1.13.8和Ember 2.0.1。內存泄漏仍然存在。 –

回答

0

原來有內存泄漏。但Ember團隊已經解決了它,只是沒有發佈修復程序。 V2.2.0-beta.1包含修復程序,顯然v.1.3.10。所以如果你遇到類似的問題,只需抓住更新的代碼即可。

非常感謝Ember團隊爲此尋找並提供解決方案。