JavaScript でメモリ制限を検出するにはどうすればいいですか? 質問する

JavaScript でメモリ制限を検出するにはどうすればいいですか? 質問する

ブラウザは、JavaScript オブジェクトに保存できるデータの量に何らかの制限を課すことができますか? もしそうなら、その制限を検出する方法はありますか?

デフォルトでは、Firefox は次の機能を実行しないようです。

var data;
$("document").ready(function() {
  data = [];
  for(var i = 0; i < 100000000000; i++) {
    data.push(Math.random());
  }
});

システムが使い果たされるまで、メモリがどんどん消費され続けます。

私たちは利用可能なメモリを検出できません、その限界に近づいているかどうかを知る他の方法はありますか?

アップデート

私が開発しているアプリケーションは、非常に高速な応答時間がなければ使用できません (これが主なセールス ポイントです)。残念ながら、データ セットも非常に大きくなっています (低性能のクライアント マシンのメモリに収まらないほどです)。データを戦略的に事前にロードする (クリックされるものを推測する) ことで、パフォーマンスを大幅に向上できます。推測が間違っている場合は、サーバーからデータをロードするフォールバックが機能しますが、サーバー ラウンド トリップは理想的ではありません。メモリをできるだけ活用することで、アプリケーションのパフォーマンスを可能な限り高めることができます。

現時点では、ユーザーがパフォーマンス設定 (最大データ設定) を「構成」できるように機能していますが、ユーザーはそれを管理したくありません。また、Web アプリケーションであるため、コンピューターごとにユーザー設定を処理する必要があります (強力なデスクトップには古い iPhone よりもはるかに多くのメモリがあるため)。システムで利用可能な最適な設定を使用する方が適切です。ただし、推測値が高すぎると、クライアント コンピューターでも問題が発生する可能性があります。

ベストアンサー1

一部のブラウザでは可能かもしれませんが、一般的な顧客にとって許容できる制限を決定し、オプションで制限を定義する UI を提供するのが適切なアプローチです。

重いウェブアプリのほとんどは、JavaScriptヒープサイズが10MB程度あれば大丈夫です。ガイドラインはないようです。しかし、デスクトップで100MB以上、モバイルで20MB以上消費するのはあまり良くないと思います。それ以降はすべて、ローカルストレージを検討してください。例:ファイルシステムAPI(そしてそれを永続的にすることもできます)

アップデート

この答えの背後にある理由は次のとおりです。ユーザーが 1 つのアプリケーションのみを実行することはほとんどありません。ブラウザーでタブが 1 つだけ開いていると想定すると、さらにその可能性が高くなります。結局のところ、使用可能なメモリをすべて消費することは決して良い選択肢ではありません。したがって、上限を決定する必要はありません。

ユーザーが Web アプリに割り当てたいメモリの妥当な量は推測するしかありません。たとえば、高度にインタラクティブなデータ分析ツールは JS で実現可能で、数百万のデータ ポイントが必要になる場合があります。1 つのオプションは、デフォルトで解像度を低く設定すること (たとえば、1 秒ごとの測定ではなく 1 日の測定) やウィンドウを小さく設定すること (1 日ではなく 10 秒単位) です。ただし、ユーザーがデータ セットを探索し続けると、必要なデータが増え続け、エージェント側の基盤となる OS が機能しなくなる可能性があります。

良い解決策は、いくつかの合理的な初期仮定に従うことです。いくつかの一般的な Web アプリケーションを開いて、開発ツール - プロファイル - ヒープ スナップショットに移動して確認してみましょう。

  • FB: 18.2 MB
  • Gメール: 33 MB
  • Google+: 53.4 MB
  • YouTube: 54 MB
  • Bing マップ: 55 MB

注: これらの数値には、ヒープ上の DOM ノードと JS オブジェクトが含まれます。

そうなると、人々は便利な Web サイトには 50 MB の RAM が必要だと受け入れるようになるようです。2022年アップデート:現在では平均して 100MB 近くになっています。DOM ツリーを構築したら、データ構造にテスト データを入力し、RAM に保持できるデータ量を確認します。

ちなみに、Chrome でデバイス エミュレーションをオンにしながら同様の測定を行うと、タブレットとスマートフォンでの同じサイトの消費量を確認できます。

このようにして、デスクトップでは 100 MB、モバイル番号では 20 MB という値にたどり着きました。妥当な値であるようにも思えます。もちろん、ときどきヘビーユーザーの場合は、最大ヒープを 2 GB まで増やすオプションがあると便利です。

さて、毎回サーバーからこのすべてのデータを取り出すのにコストがかかりすぎる場合はどうすればよいでしょうか?

1 つは、アプリケーション キャッシュを使用することです。バージョン管理が多少面倒になりますが、約 5 MB のデータを格納できます。ただし、データを格納するのではなく、アプリ コードとリソースを保持する方が便利です。

それ以外には、3 つの選択肢があります。

そのうち、ファイルシステム 最も支持されており、 使えるかなりの量のストレージ

おすすめ記事