11

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 リンクで説明されているように)、メモリ使用量が増加します。

私がすでに読んだもの:

私のテスト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"
}

この問題についての説明はありませんので、どんな助けでも大歓迎です。これについてさらに情報が必要な場合は、お気軽にお問い合わせください。

4

1 に答える 1

2

XmlHttpRequest は各応答をキャッシュするため、URL を一意にするために日付を追加しています。

キャッシュは通常どおりディスクに書き込まれますが、存在する限り、要求を行った XmlHttpRequest にも保持されます。

リクエストごとにインスタンスを使用して破棄するか、プラグマと xhr 設定でキャッシュを無効にする必要があります。

于 2012-10-12T09:54:42.997 に答える