微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – ExtJS4内存泄漏

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

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

这是我的商店定义:

@H_404_10@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' }] });

这就是我从中删除记录的方式:

@H_404_10@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--; }

但是当我在调试此问题时检查控制台时,我可以看到,记录实际上是从商店中删除的,而不是从内存中删除的.

编辑/ UPDATE:
我试图在你的答案中使用建议解决问题,但两者都无法解决.可以肯定的是,我得到了问题来源,我提取了我的商店代码,以便更仔细地检查它,看看它是否真的导致了问题.你可以看到下面的整个代码

@H_404_10@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 }); } });

现在关于这个的奇怪部分:内存泄漏存在,即使商店部分被评论如上面的代码清单.我在任务管理方面犯了一些错误吗?

解决方法:

我使用Ext JS发现的众多问题之一是Ext.data.Model#destroy实际上并没有在本地清理记录. destroy方法使用商店的代理发送该记录的销毁请求(例如,如果需要从数据库删除相应的记录).如果这是你的预期行为,那就不用担心了.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐