oracleのドキュメント]1には、次のように書かれています。
-Xmxsize メモリ割り当てプールの最大サイズ(バイト数)をバイト単位で指定する ...デフォルトでは システム構成に基づいて実行時に選択されます。
システム構成*とは何ですか?
これは実装やバージョンによって異なりますが、通常は使用するVM(クライアントやサーバーなど、-client
と-server
のパラメータを参照)とシステムメモリに依存します。
多くの場合、そのデフォルト値は物理メモリの1/4または1GB(いずれか小さい方)です。
また、Javaの設定オプション(コマンドラインパラメータ)は、-Xmx
などの環境変数にアウトソースすることができ、デフォルトを変更する(新しいデフォルトを指定する)ことができます。特に、JAVA_TOOL_OPTIONS
という環境変数は、すべてのJavaツールによってチェックされ、存在すれば使用されます(詳細はこちらとこちら)。
以下のコマンドを実行すると,デフォルト値を確認することができます。
java -XX:+PrintFlagsFinal -version
Xmxは
MaxHeapSizeに、
Xmsは
InitialHeapSizeに含まれています。出力をフィルタリングするか (Linux では
|grep`)、ファイルに保存して検索できるようにします。
ご指摘のとおり、デフォルトの -Xmxsize
(Maximum HeapSize) はシステム構成に依存します。
Java8は、Xmssize
(最小ヒープサイズ)では物理メモリの1/6の大きさを取り、Xmxsize
(最大ヒープサイズ)では物理メモリの1/4の小ささを取ります。
つまり、物理メモリが8GBのRAMであれば、Xmssize
は8(1/6)の大きさ、Xmxsize
は8(1/4)の小ささとなります。
デフォルトのHeapSizeは以下の方法で確認できます。
Windows**の場合。
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Linux**の場合
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
これらのデフォルト値は、必要に応じてオーバーライドすることもできます。
意外なことに、この質問には明確な文書による回答がありません。 もしかしたら、別のデータがあれば、答えを探している人にとって価値があるかもしれません。 CentOS (6.8,7.3)とJava 8 (build 1.8.0_60-b27, 64-Bit Server)を使用している私のシステムでは、次のようになります。
default memoryは物理メモリの1/4で、1GBの制限はありません。
また、-XX:+PrintFlagsFinal
はSTDERRに出力されるので、上記の他の人が提示した現在のデフォルトメモリを決定するコマンドは、以下のように微調整する必要があります。
java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
以下は、64GBの物理的なRAMを持つシステムで返されます。
uintx MaxHeapSize := 16873684992 {product}