ExtJS4 内存泄漏问题

3
我有一个使用ExtJS 4.1.1编写的应用程序,其中经常使用一种数据仓库。我从服务器获取数据示例,并通过其“add”方法将其添加到仓库中进行一些验证。我定期执行此操作并从仓库中删除不需要的记录。
问题是,我的应用程序随着时间的推移越来越消耗内存,而且似乎已经找到了问题的来源,但我不知道该如何处理它。
以下是我的仓库定义:
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'
        }]
    });

这是我从中删除记录的方法:
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--;
}

当我在调试这个问题时,我检查了控制台,发现记录实际上已经从存储中删除了,但是没有从内存中删除。
编辑/更新: 我尝试根据你们的建议来解决这个问题,但都无法解决。为了确保我正确地找到了问题的源头,我提取了我的存储代码以更仔细地检查它,并查看它是否真的引起了问题。您可以在下面看到整个代码:
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
    });
}
});

现在有个奇怪的问题:即使像上面代码清单中所示,存储部分被注释掉,内存泄漏仍然存在。我在任务管理方面犯了一些错误吗?
2个回答

5
使用Ext JS时需要注意的一个陷阱是,Ext.data.Model#destroy方法实际上并不会在本地清除记录。如果你需要从数据库中删除相应的记录,则destroy方法会使用存储代理发送销毁请求。如果这是你想要的行为,那么就没问题了。
当您从存储中删除记录时,该存储将在名为removed的数组中保留对该记录的引用。您可以在Ext.data.Store#remove方法的底部看到它。建议使用JavaScript调试器,在几次删除后检查存储对象,以查看是否缓存了记录。如果是,那么只需调用store.removed.length = 0;即可清除它。

我完全忘记了那个数组。+1 - sra

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

也许 sra 的说法是正确的,你自己在其他地方的一个闭包中持有该记录的引用?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接