web-dev-qa-db-ja.com

JVMの最大ヒープサイズについて-32ビットと64ビット

読み取り 32ビットWindowsの最大ヒープサイズは〜1.5GBです。これは、JVMが連続メモリを必要とするためです。 「連続メモリ」の概念と、Windowsで最大1.5GBしか使用できない理由を誰かが説明できますか?

第二に、64ビットWindowsの最大ヒープサイズは何ですか?また、32ビットで利用可能なものとこれが異なるのはなぜですか?

33
Marcus Leon

32ビット/ 64ビットの部分はJavaとは無関係です

32ビットシステムのメモリの場所は、32ビットの符号なし整数によって参照されることがわかりました。これにより、最大2 ^ 32のメモリロケーションが可能になります。各場所には1バイトが格納されるため、必要に応じて2 ^ 32バイトまたは4 GBを取得できます。

64ビットシステムでは、2 ^ 64の場所、または16エクサバイトがあります。

さて、Windowsでは、連続した部分が大きな問題になりますが、それがWindowsのやり方です。アイデアは、ヒープに「中断されない」範囲全体を確保する必要があるということです。悲しいことに、Windowsは途中でメモリを割り当てます。基本的に、ヒープを割り当てるために、左側の半分または右側の半分、約1.5〜2GBのチャンクが残ります。

32ビットと64ビットの詳細については、 この質問 をご覧ください。

編集:エクサプレフィックスのmrjoltcolaに感謝します!

36
Pace

連続とは、単純に「ギャップなし」、つまり1つの長い単一セグメントを意味します。この量は、OSがプロセスにマップできるセグメントの大きさによって制限されます。 Javaが連続したヒープを必要とするかどうかは、JVM固有の実装の問題であり、他のVMには存在しない場合があります。

6
codenheim

連続メモリは、ウィンドウを1.2 GBのヒープのみに制限する問題ではありません。最小/最大ヒープが定義されていても、JVMは起動中にシステムメモリから最大ヒープを占有します。その後、占有するシステムメモリ内の最小ヒープのみを拡張するまで参照します。パフォーマンスを向上させるために、ほとんどの実装でJVMを起動するには、最大ヒープの連続メモリが必要です。

Marcusが上記で説明したように、32ビットハードウェアの制限は、単一プロセス(スレッド)で4GBです。すべてのオペレーティングシステムは、この4GBに個別に対応します。 4GBは、カーネルスペースとユーザースペースとして主に分割されます。 32ビットウィンドウでは、最大ユーザー領域は1.5 GBに近くなります。/3GBスイッチを使用してWindowsを起動して、ユーザースペースを増やすオプションがあります。