同期 AJAX リクエストを使用したメモリ リークは、多くの場合、次の原因で発生します。
- setInterval/setTimout を使用すると循環呼び出しが発生します。
- XmlHttpRequest - 参照が削除されると、xhr にアクセスできなくなります
メモリ リークは、ブラウザが何らかの理由で不要になったオブジェクトからメモリを解放しない場合に発生します。
これは、ブラウザーのバグ、ブラウザーの拡張機能の問題、そしてごくまれに、コード アーキテクチャの間違いが原因で発生する可能性があります。
新しいコンテキストで setInterval を実行したときに発生するメモリ リークの例を次に示します。
var
Context = process.binding('evals').Context,
Script = process.binding('evals').Script,
total = 5000,
result = null;
process.nextTick(function memory() {
var mem = process.memoryUsage();
console.log('rss:', Math.round(((mem.rss/1024)/1024)) + "MB");
setTimeout(memory, 100);
});
console.log("STARTING");
process.nextTick(function run() {
var context = new Context();
context.setInterval = setInterval;
Script.runInContext('setInterval(function() {}, 0);',
context, 'test.js');
total--;
if (total) {
process.nextTick(run);
} else {
console.log("COMPLETE");
}
});