3

私は ExtJS 4.1.1 で書かれたアプリケーションを持っていますが、これは 1 つのストアを頻繁に使用します。サーバーからデータ サンプルを取得し、いくつかの検証の後、「add」メソッドを使用してストアに追加します。私はこれを定期的に行い、必要のないレコードもストアから削除します。

問題は、時間の経過とともにアプリケーションが RAM をますます消費していることです。問題の原因はわかったようですが、対処方法がわかりません。

これが私の店の定義です:

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

これに関する奇妙な部分: 上記のコード リストのようにストア部分がコメント化されていても、メモリ リークが発生します。タスク管理を間違えた?

4

2 に答える 2