3

質問は非常に基本的なものですが、JVM の最大メモリ割り当てがアプリケーションに対してどのように行われるかを理解したいと思っています。約 60 の仮想管理対象サーバー (つまり 60 の JVM) をホストする Windows 2008 サーバーでアプリケーションを実行しています。各管理対象サーバーには、最大 1024m のヒープが設定されています。Windows は 32 GB RAM で構成されています。

JVM への最大メモリ割り当てはどのように行われるのでしょうか。それは一度に行われますか、それとも段階的な成長ベースで行われますか? 32 GB の RAM が詰め込まれたシステムでアプリケーションをホストしている 60 台の管理対象サーバーすべてを Windows が一度に処理する方法を教えてください。

どんな意見でも大歓迎です。ありがとうございました。

4

4 に答える 4

3

JVMは、実際には-Xmx、起動時に要求されたすべてのメモリと、JVM実行可能ファイルおよび内部作業領域を保持するための追加メモリを割り当てます。また、スレッドを作成すると、それらのスレッドに使用されるスタックにもメモリが割り当てられます。

これが機能するのは、(1)JVMが実際にこのメモリを使用せず、(2)OSがページングファイルを提供するためです。JVMが割り当てを要求すると、OSによるコミットメントが作成されますが、実際には要求されたすべてのRAMを使用するわけではありません。実際にはRAMを使用するため、OSはページファイルとの間でページを交換します。すべてのプロセスがRAMをアクティブに使用している場合、OSはページを常にスワップインおよびスワップアウトする必要があります。これは「スラッシング」と呼ばれます。

このパラメーターは、全体のヒープサイズ内-Xmsの初期ヒープサイズを指定します。JVMはメモリをこれらの範囲内に維持しようとしますが、十分なガベージを再利用できない場合は範囲​​を拡張できます。ただし、これらのヒープの増加は、OSからより多くのメモリを段階的に要求することはありません。そうした場合、ヒープは断片化され、大きな配列の割り当てが失敗する可能性があります(連続したメモリに収まらないため)。

于 2013-02-06T15:26:25.407 に答える
1

-Xmx パラメータは、JVM が使用できる最大メモリを指定しますが、起動直後に OS から割り当てられません。必要に応じて、通常は多くのステップで段階的に実行します (つまり、JVM の Java アプリケーションは、実行時により多くのメモリを必要とします)。

もちろん、これはデフォルトの動作であり、他の多くの JVM パラメータで変更できます。

于 2013-02-06T15:19:52.267 に答える
1

JVM は最初に、オプションで指定された量のメモリを割り当て-Xmsます (私の知る限り、デフォルトは 32M です)。このメモリが不足すると、-Xmxオプションで指定された量 (デフォルトは 64M) に達するまで、新しいメモリの割り当てを段階的に開始します。

これが発生すると、OutOfMemoryエラーがスローされます。

PS もちろん、これは非常に単純化されたアルゴリズムです。実際、JVM はもっと複雑なものを使用します。

于 2013-02-06T15:16:41.923 に答える
1

プロセスを起動するたびに割り当てたい場合は、-Xms を指定する必要があります。-Xmx のみを指定すると、VM はその値まで成長しますが、より多くのメモリが必要な場合にのみ増加します。

于 2013-02-06T15:17:23.090 に答える