例として、JVMの最大ヒープを4GBに設定したとしましょう。ただし、アプリケーションが約3GBに達すると、OSが一部のメモリをディスクにスワップし始めます。この時点でいくつかのオブジェクトがすでにスコープ外にあり、より多くのメモリを要求する代わりに、JVMは最初に古いオブジェクトをガベージコレクションできます。パフォーマンスの点では、メモリスワッピングを行うよりも、ガベージコレクションを実行する方が適切です。このような状況については、JVMガベージコレクションは賢いですか、それともまったく認識していませんか?この状況に対処するために、JVMを何らかの方法で調整できますか?
3GBに達する前にガベージコレクションが実行される可能性があるため、実際にはメモリを交換する必要はありませんが、それでも私の質問には答えられません。
編集:私のマシンに4GB以上のメモリがあると仮定しましょうが、時々他のアプリケーションがそのメモリの一部を使用して4GB未満のメモリを残していることがあります。ほとんどの場合4GBになるので、最大ヒープサイズを減らす必要はありませんが、他の状況でもGCが十分にスマートであるかどうか疑問に思っていました。
JVMは幸いにも、基になるOSメモリ管理を認識していません。私は少し前にGC最適化に関するJavaOneセッションに参加したことを覚えており、スピーカーは、JVMを実行するために十分な空きメモリ(RAM、スワップではない)があることを常に確認する必要があることを強調しました。システムの特定の時点で使用可能なメモリよりも多くのメモリをJVMに割り当てます。さらに、一部のGC収集アルゴリズムが機能するため、収集するメモリブロックがページングされると、パフォーマンスが大幅に低下する可能性があります。
したがって、システムで物理的に利用可能なメモリよりも多くのメモリをJVMに割り当てないでください。また、外部プロセスによってメモリ使用量が時間の経過とともに増加することが予想される場合は、ページングされないようにするヒープスペースを割り当ててください。そして、これらの条件を満たせない場合は、より多くのRAMが必要です:)
更新:SOを少し検索したところ、これが見つかりました。ここでkdgregoryは、GCの動作方法が原因でページングは問題にならないはずだと主張していますが、通常の状態、つまりメモリがしばらく触れられていないためページングを検討しています。メモリとあなたは間違いなくページングを開始します。また、Linuxフレーバーを実行している場合は、John Ferminellaの回答と、Linuxでのスワップを理解および調整する方法を説明する彼の素晴らしいブログ投稿を確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加