首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExtJS4内存泄漏

ExtJS4内存泄漏
EN

Stack Overflow用户
提问于 2013-01-30 22:53:59
回答 2查看 2.6K关注 0票数 3

我有一个用ExtJS 4.1.1编写的应用程序,它经常使用一个商店。我从服务器获取数据样本,经过一些验证后,我使用它的" add“方法将其添加到存储中。我定期这样做,我也会从存储中删除不需要的记录。

问题是,随着时间的推移,我的应用程序消耗了越来越多的RAM,似乎我已经找到了问题的根源,但我不知道如何处理它。

下面是我的商店定义:

代码语言:javascript
复制
this.store = Ext.create('Ext.data.Store', {
        fields: ['when', 'data1', 'data2', 'data3', 'data4', 'data5', 'data6', 'data7', 'data8', 'data9'],
        proxy: {
            type: 'memory',
            reader: {
                type: 'json',
                root: 'users'
            }
        },
        sorters: [{
            property: 'when',
            direction: 'ASC'
        }]
    });

下面是我如何删除其中的记录:

代码语言:javascript
复制
var record = self.store.getAt(j);
if((record.get('when') <= newMinDate) && (record.get('data'+id) !==' ')) {
  self.store.remove(record);
  record.destroy();
  record = null;
  j--;
  ln--;
}

但当我在调试这个问题时检查控制台时,我可以看到,记录实际上是从存储中删除的,但不是从内存中删除的。

编辑/更新:我试着使用你答案中的建议来解决这个问题,但都不能解决它。为了确保我的问题源是正确的,我提取了我的商店代码,以便更仔细地检查它,看看它是否真的导致了问题。你可以看到下面的完整代码:

代码语言:javascript
复制
Ext.define('TestApp.App', {
extend: 'Ext.app.Application'
});

Ext.application({
extend: 'MyApp.app.Application',

store: null,

launch: function() {
    var self = this;
    self.store = Ext.create('Ext.data.Store', {
        fields: ['when', 'data1', 'data2', 'data3', 'data4', 'data5', 'data6', 'data7', 'data8', 'data9'],
        proxy: {
            type: 'memory'
        },
        sorters: [{
            property: 'when',
            direction: 'ASC'
        }]
    });
    self.beginTask();
},

beginTask: function() {
    var self = this;
    Ext.TaskManager.start({
        run: function() {
            var jsonRaw = *very large json*; //about 650 samples
            var json = Ext.JSON.decode(jsonRaw, true);
//                self.store.add(json.data.samples);
//                var ln = self.store.getCount();
//                for (var j=0; j<ln; j++) {
//                    var record = self.store.getAt(j);
//                    self.store.remove(self.store.getAt(j));
//                    j--;
//                    ln--;
//                    record.destroy();
//                    delete record;
//                }
            json = null;
            jsonRaw = null;
        },
        interval: 1000
    });
}
});

现在奇怪的是:即使存储部分像上面的代码清单那样被注释,内存泄漏也是存在的。我是不是在任务管理方面犯了什么错误?

EN

回答 2

Stack Overflow用户

发布于 2013-01-31 21:02:17

我在使用Ext时发现的许多问题之一是,Ext.data.Model#destroy实际上并不在本地清理记录。destroy方法使用存储的代理发送对该记录的销毁请求(例如,如果需要从数据库中删除相应的记录)。如果这是你有意为之的行为,那就别担心。

当您从存储区中删除记录时,该存储区将在名为removed的数组中保留对该记录的引用。您可以在Ext.data.Store#remove方法的底部看到它。我建议使用JavaScript调试器,并在几次删除后检查您的存储对象,以查看您的记录是否被缓存。如果是这样,那么调用store.removed.length = 0;来清除它就足够简单了。

票数 5
EN

Stack Overflow用户

发布于 2013-01-31 20:58:06

如果在删除之后执行store.sync(),会发生什么?不知道这是否对内存代理有帮助,但我认为它应该会删除对已删除记录的引用。只是在记录上执行remove(record)并不能真正删除该记录,它只是将其标记为删除,并停止在存储中将其公开为可用。至少对于其他代理类型是这样的。只有在通过store.sync();同步了商店的已修改记录(添加、删除、更新)之后,才能执行实际的删除。这就是存储在内部列表中保存处于新状态的记录的时候。

也许sra无论如何都是正确的,而您自己在其他地方的闭包中持有对记录的引用?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14606852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档