Dojo で作成した Web アプリケーション内でのメモリ増加の問題を詳しく説明するために、週末全体を費やしました。
Web アプリケーションは「永久に実行」されるため、ブラウザの再起動は予定されていません。
アプリケーションは定期的にサーバー (クロスドメインではない) から動的データを更新しています。5 秒ごとに AJAX 呼び出しが行われ、新しいデータが JSON として取得されます。
アプリケーションを何時間も実行すると、ブラウザのメモリが常に増加することがわかりました (最新の Chrome と Firefox の両方で、最新の Windows と Mac OS X の両方で)。
最初は、Dojo がこの動作を引き起こしていると思いました。実際、XMLHttpRequest オブジェクトを使用してネイティブ実装に切り替えることで、メモリの増加を劇的に減らすことができましたが、メモリはまだ存在しています。AJAX リクエストごとに、メモリが少し増加します (約 4 ~ 8KB)。
私がすでに試したこと:
私は持っている...
- ...jQuery、YUI などの他のフレームワークを使用しようとしました- 効果なし
- ...ネイティブの `XMLHttpRequest` オブジェクトの使用に切り替えました - 大いに役立ちましたが、完全ではありませんでした
- ...データを取得した後の DOM 操作の無効化- 効果なし
- ...「xhr」を「null」に設定し、各反復後に削除することで「xhr」をリセットしました-効果はありません
- ...各反復後にonreadystatechangeハンドラーをnullまたは空のメソッドにリセット-効果なし
- ... `xhr` オブジェクトと `onreadystatechange` ハンドラーを再利用しました。これは常に同じであるため- 効果なし
そのため、ロードされたデータで何もしなくても (以下の最初の StackOverflow リンクで説明されているように)、メモリ使用量が増加します。
私がすでに読んだもの:
- XMLHttpRequest と setInterval でのメモリ リーク
- XMLHttpRequest を使用した Web ページの自動更新メモリ リーク
- ラップされた XMLHttpRequest 関数でのメモリ リーク
- http://forum.jquery.com/topic/memory-leaks-with-ajax-calls
- そしてもっと...
私のテストHTMLコード:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Native XHR Async</title>
</head>
<body>
<script>
var update = document.createElement("div");
document.body.appendChild(update);
var timeout = null;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = onReadyState;
function loadData()
{
xhr.open("GET","memory-leak.json?" + new Date().getTime());
xhr.send(null);
}
function onReadyState()
{
if (this.readyState === 4)
{
if( this.status === 200 )
{
update.innerHTML = "";
update.innerHTML = this.responseText;
}
if( timeout !== null )
{
clearTimeout(timeout);
delete timeout;
}
timeout = setTimeout(loadData, 1000);
}
}
loadData();
</script>
</body>
</html>
そして、私のテスト JSON (同じディレクトリ内):
{
"errorstatus":"Okay",
"B0":{"P":"0 Watt"},
"E0":{"P":"28 Watt"},
"Z0":{"P":"28 Watt"},
"S0":{"P":"0 Watt","SOC":"74%"},
"Z1":{"P":"0 Watt"},
"R0":0,
"R1":0,
"R2":0,
"date":"29.09.2012 09:23:19",
"Version":"Sep 28 2012-15.22"
}
この問題についての説明はありませんので、どんな助けでも大歓迎です。これについてさらに情報が必要な場合は、お気軽にお問い合わせください。