Java や .NET などの管理された環境で個人的に使用した最大のヒープは? 遭遇したパフォーマンスの問題にはどのようなものがありますか? また、ヒープが大きいほど収益が減少しましたか?
5 に答える
私は通常 9 ~ 12 GB、時には 20 GB を使用する 64 ビットの .Net システムで作業しています。ガベージ コレクション中でもパフォーマンスの問題は見られませんでした。
以前のバージョンでは、一部のオブジェクトに長時間ハングアップしていたため、時折 GC によって 3 GB 以上が解放されていました。それでも、パフォーマンスに目立った影響はありませんでした。システムは 32 GB の RAM を搭載した 16 コアのサーバーで実行されているため、おそらく役に立ちます...
.Net では、Windows 32 ビット上で、実際には約 1.4 GB のメモリ使用量しか得られず、実際には問題が発生し始めます (メモリ不足の例外)。これは、1 つのプロセスが 2 GB を超える RAM を使用するように制限する 32 ビット ウィンドウの制限によるものです。boot.ini に入れることができる /3GB スイッチがありますが、それはほんの少し先のことになります。多くのメモリを使用したい場合は、64 ビット バージョンの Windows で実行することを真剣に検討する必要があります。
現在、6 GB のメモリを搭載した運用アプリケーションを使用しています。JVM がこれだけの処理を行えるようにするには、64 ビットのボックスも必要です。ガベージ コレクターは、パフォーマンスがサイズとともに低下する唯一のもの (私がこれまでに発見したこと) であり、System.GC を手動で開始した場合のみです。これにより、JVM は通過中にすべてをきしむ音で停止させられます。 6 GB 相当のオブジェクト。こちらも20秒ほどかかります。デフォルトの GC の振る舞いはこれを行いません。このサイズでの JVM チューニングについても調査する価値があります。
また、分散型およびクラスター化された JVM のようなものも見つけることができます。申し訳ありませんが、このオプションを詳しく調べていないため、適切な参照がありません。ただし、大規模なインストールへの参照は見つかりました。
私はJavaで2GBから5GBのメモリを使用しましたが、通常、2GBを超えると、メモリの最適化について真剣に考え始めます。利益の減少は、大量のメモリがあるために必要なときに最適化を行わないことから、OS/ディスク キャッシュに使用できるメモリがないこと (アプリケーション全体に役立つ可能性があります) までさまざまです。
Java の場合、世代ごとのメモリ使用量を長期にわたって監視することをお勧めします。大量の一時オブジェクトを作成したり、大量のメモリを消費する長期オブジェクトを作成したりしていませんか? これらのことを知っていれば、メモリの多くの最適化を行うことができます。
ヒープとは何を意味するのかわかりませんが、使用されているメモリを意味する場合は、かなりの量、2GB+ を使用しています。画像処理を行う Web アプリがあり、分析を行うために 2 つの大きなスキャン ファイルをメモリに読み込む必要があります。
パフォーマンスの問題がありました。Windows は大量の RAM をスワップアウトし、それによって多くのページ フォールトが発生します。すべてのリクエストがそれらの画像を取得したため、一度に 2 つ以上の画像が必要になることはありませんでした (一度に画像セットごとに 1 つのセッションしか許可しませんでした)。
たとえば、最初の表示用にファイルをセットアップするには、約 5 秒かかります。単純な分析とズームを実行すると、メモリ内で 0.1 秒から 0.5 秒のオーダーでかなり高速になります。
私はまだ最適化する必要があったので、最終的にはファイルを準備して小さなピースに切り刻み、その時点でユーザーが必要としていたピースのみを操作しました。