余烬组件内存泄漏



我在一个大型Ember-CLI应用程序中遇到了非常严重的内存泄漏。我可以很容易地复制,让应用程序变慢,然后完全崩溃。

在花费了大量时间查看性能瓶颈等(这导致了改进)之后,我确定我有内存泄漏。

本着一贯的精神,我尽量使这段代码尽可能简单。我的结论是:Ember组件在有条件包含时泄漏内存。

然而,我看不到其他人抱怨,所以想知道我是否忽视了一些明显的东西?

我的测试应用程序产生完全相同的输出,但是以两种不同的方式。在这两种情况下,应用程序初始化,它创建了一个包含1000个简单对象的数据数组,其中一个属性是vis,最初设置为false。在初始延迟之后,这1000个对象的vis属性每隔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);
        }
    },
});

在TEST 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"),
    });

item-visible和item-hidden只是带有静态文本hiddenvisible的HBS文件。

所以当它运行时,我得到1000行隐藏,慢慢地变成可见。在这种情况下,数据项交换中的逻辑是哪个组件输出文本,最初是项隐藏的,然后是项可见的。

Chrome开发工具的时间线快照

在这里,您可以看到消耗的内存不断增加。

这里有个问题:http://ember-twiddle.com/c9c3e6c5a9908bd2c438

在TEST 2中,我省略了item-visible/item-hidden组件,data-item现在使用内联条件逻辑直接输出隐藏/可见文本。

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

Chrome开发工具的时间线快照

这个时间内存被不时地释放,正如我所期望的。

这里有个问题:http://ember-twiddle.com/01b1abe7badea3ce3a16

所以我的问题是,为什么有条件地包括这样的组件导致这种内存泄漏?我能做些什么来避免它呢?

在我的实际应用中,我有这样的逻辑:

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

这有相同的内存泄漏问题。

我使用Ember 1.3.8(与最新的Ember- cli), Twiddle似乎使用1.3.10

原来存在内存泄漏。但是烬团队已经解决了这个问题,只是没有发布修复。V2.2.0-beta。1包含修复,v.1.3.10也包含修复。因此,如果您有类似的问题,只需获取较新的代码。

非常感谢Ember团队看到这个问题并提供修复。

最新更新