9

すぐに明確にしましょう: これはメモリ リークに関する問題ではありません! ユーザーがデータを入力できるページと、このデータを処理して結果を生成する JavaScript があります。JavaScript は、次のような DIV で増分出力を生成します。

(function()
{
   var newdiv = document.createElement("div");
   newdiv.innerHTML = produceAnswer();
   result.appendChild(newdiv);
   if (done) {
      return;
   } else {
      setTimeout(arguments.callee, 0);
   }
})();

特定の状況下では、計算によって非常に多くのデータが生成されるため、IE8 は次のメッセージで失敗します。

あまりにも多くのデータを処理するときに十分なストレージがありません

問題は、どのくらいのデータが多すぎるかを判断する方法はありますか?

私が言ったように、解決すべきバグはありません。計算で大量の html 要素を作成する必要があるため、これは正真正銘のメモリ不足です。

私の考えは、計算を実行する前に関数を実行して、ブラウザが成功するかどうかを判断することです。しかし、そのためには、一般的な方法で、ブラウザーで使用できるメモリを見つける必要があると思います。

どんな提案でも大歓迎です。

4

4 に答える 4

5

Javascript (ブラウザー内) はサンドボックスで実行されます。つまり、ローカル ファイルやシステム リソースなどのセキュリティ上の問題を引き起こす可能性のあるものへのアクセスから隔離されているため、メモリ使用量を検出することはできません。

他の回答が述べているように、実装間で一時停止するか、リソースをあまり消費しないコードを使用することで、ブラウザーのタスクを簡単にすることができますが、すべてのブラウザーには限界があります。

于 2010-01-08T13:25:12.777 に答える
3

これで遊んでください...

document.write(performance.memory.jsHeapSizeLimit+'<br><br>');
document.write(performance.memory.usedJSHeapSize+'<br><br>');
document.write(performance.memory.totalJSHeapSize);
于 2015-03-31T09:16:57.853 に答える
1

ループは、再帰よりも少ないメモリを使用します。

   do
   {
     var newdiv = document.createElement("div");
     newdiv.innerHTML = produceAnswer();
     result.appendChild(newdiv);
   } while (!done);

生成される回答の数に上限を設定することもできます。

   var answerCount = 0;
   do
   {
     var newdiv = document.createElement("div");
     newdiv.innerHTML = produceAnswer();
     result.appendChild(newdiv);
   } while (!done && answerCount++ < 1000);
于 2010-01-08T13:20:56.107 に答える
0

タイムアウト遅延が0であることが問題であると思われます-すぐに再実行しようとしています。これを増やしてみてください。

于 2010-01-08T12:57:57.743 に答える