3

このブログコメントは次のように述べています。

チャンクヒープを作成する方法はわかっていますが、それらを使用するにはオーバーヘッドが発生します。32ビットJVMの大きなヒープよりも高速なストレージ管理に対する要求が多くあります。本当に大きなヒープが必要な場合は、64ビットJVMに切り替えてください。連続したメモリが必要です が、64ビットのアドレス空間に入れる方がはるかに簡単です

上記のステートメントのこの意味は、64ビットアドレス空間で連続したメモリを取得する方が簡単であるということです。これは本当ですか?もしそうなら、なぜですか?

4

2 に答える 2

4

それは非常に真実です。プロセスは、仮想メモリのアドレス空間からメモリを割り当てる必要があります。コードとデータの両方を格納し、アーキテクチャのアドレス指定機能によってサイズが制限されます。バンク切り替えのトリックを除いて、32ビットプロセスで2^32バイトを超えるアドレスを指定することはできません。これは4ギガバイトです。オペレーティングシステムは通常、その中から大きなチャンクを取り出します。たとえば、32ビットWindowsでは、アドレス可能なVMサイズを2ギガバイトに削減します。

理想的には、それらがぴったりと合うように割り当てが行われます。それが実際にうまくいくことはめったにありません。特に共有ライブラリまたはDLLは、優先ロードアドレスを選択する必要があり、ライブラリの構築時に事前に推測する必要があります。

したがって、実際には、割り当ては既存の穴の間の穴から行われ、取得できる最大の連続した割り当ては、最大の穴のサイズによって制限されます。通常、アドレス可能なVMサイズよりもはるかに小さく、Windowsでは通常約650メガバイトです。使用可能なアドレス空間が割り当てによって断片化されているため、それはそこから下り坂になる傾向があります。特に、圧縮ガベージコレクターによって割り当てを移動させる余裕がないネイティブコードによって。Windowsを使用している場合は、SysInternalsのVMMapユーティリティを使用してVMの割り当てに関する洞察を得ることができます。

この問題は、64ビットプロセスで完全に解消されます。理論上のアドレス可能な仮想メモリのサイズは2^64であり、膨大な数です。現在のプロセッサでは実装されていないほど大きいため、最大2^48になる可能性があります。お使いのオペレーティングシステムのバージョンと、その量のVMのページマッピングテーブルを保持する意欲によってさらに制限されます。8テラバイトが一般的な制限です。含意によって、割り当て間の穴は巨大です。あなたのプログラムは、OOMで死ぬ前に、ページングファイルのスラッシングに熱心に取り組みます。

于 2013-02-13T13:52:21.723 に答える
0

JVMがどのように実装されているかについては明らかに言えませんが、純粋に理論的な観点から、仮想アドレス空間が非常に大きい場合(たとえば、32ビットと比較して64ビット)、大きなものを見つけるのは非常に簡単です。割り当てに使用できる連続したメモリのブロック(極端になります-32ビットアドレス空間で連続した4GBの空きメモリを見つける可能性はありませんが、完全な64ビットでこの空間を見つける可能性はかなりありますアドレス空間)。

仮想アドレス空間のサイズが何であれ、これは(おそらく)連続していない物理メモリページの割り当てによって実装されることに注意してください。特に、要求された割り当てが大きい場合は、仮想アドレス空間が大きいということは、使用可能なはるかに連続した仮想アドレスである可能性があります。

于 2013-02-13T11:21:28.773 に答える