在大型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
爲什麼你不應該考慮打開一個問題[這裏](https://github.com/emberjs/ember.js/issues)? –
我現在這樣做了:https://github.com/emberjs/ember.js/issues/12513 –
供參考:我現在已經更新了應用程序Ember-CLI 1.13.8和Ember 2.0.1。內存泄漏仍然存在。 –