64ビットプラットフォームでJavaに割り当てることができるヒープスペースの最大量はいくつですか?それは無制限ですか?
理論的には264、しかし制限があるかもしれません(明らかに)
このFAQ によると、ローカルシステムのメモリとスワップスペースによってのみ制限されます。
64ビットVMでは、64ビットのアドレッシング機能があり、システムが提供する物理メモリとスワップ領域の量によってのみ制限される最大Javaヒープサイズになります。32ビットJVMで大きなヒープを取得できないのはなぜですか?も参照してください。
また、コマンドラインから最大ヒープを設定する必要があることにも注意してください。 -Xmxコマンドなし。それがない場合Javaは、同じFAQによると、64ビットマシンのデフォルトの最大ヒープとして64mb + 30%= 83.2mbを使用します。
Java -Xmx1000g myClass
私のマシンでは問題なく動作します。しかし、まだ「t」修飾子をサポートしていないようで、テラバイト単位で最大メモリを指定することはまだできません:)
ユニバース内のすべてのatomを1バイトのRAMにすることができれば、64ビットのアドレス空間に割り当てることができます。
実際、それは少し大げさです。
(WolframAlphaによると)ユニバースには10 ^ 80アトムがあり、64ビットシステムには2 ^ 64バイトのアドレス空間があるため、5x10 ^ 60アトムごとに1つしかアドレス指定できません。しかし、18兆バイトのRAMを搭載している場合は、それを実現するための量子ブラックホールがいくつか必要になるでしょう。
これはおそらくあなたのVMが実行されているシステムに依存します。AMDx64アーキテクチャを実行している場合、現在出荷されているプロセッサのアドレス空間は64ではなく48ビットを使用します。これにより、約256 TB( http://en.wikipedia.org/wiki/X86-64 を参照)
私はVMの専門家ではありませんが、最新のOSは通常、物理メモリと同じ量のメモリを提供しますRAMプラス利用可能な仮想メモリ。おそらくこれは、VMが構成に応じてアプリケーションに渡すものです。
Sunの最近のVMでは、実用的なヒープ制限サイズは通常、使用可能な物理メモリまたは仮想メモリ、あるいはその両方の512倍です。理論上の制限がはるかに高い場合でも、VMは起動時に512バイトのヒープメモリごとに1バイトを割り当てます。そのため、メモリ管理のために1TBのヒープに2GBがすぐに必要になります。
理論的には2^63
および2^64
バイト。
実際には、マシンで使用できる物理メモリとスワップ領域の量によって制限されます。また、物理メモリは、チップセット(つまり、物理メモリアドレスバス上のアドレスピンの数)とマザーボード(つまり、DIMMソケットの数とサイズ)によって制限されます。