Java 8のデフォルトのXmxsize(最大ヒープサイズ)


81

では、OracleのマニュアルIが見つかりました:

-Xmxsizeメモリ割り当てプールの最大サイズ(バイト単位)をバイト単位で指定します...デフォルト値は、システム構成に基づいて実行時に選択されます。

システム構成とはどういう意味ですか?


1
つまり、システムに16 GBのRAMがある場合、サイズは512MBの場合よりも大きくなります。
JB Nizet 2015

ありがとう、どれくらい大きいですか?
Vitaly 2015


3
>>物理メモリの1/4または1GBの小さい方。ありがとう、@ alfasin。
Vitaly 2015

4
@Vitaly 1Gbの制限は-Xmx、少なくともJava 8では当てはまらないようです。これは、合計メモリが6GbのLinux 64ビットシステムでは、デフォルトで-Xmx = 1.5Gbのjvmがあるためです。
user218867 2017年

回答:


144

それは、実装やバージョンによって異なりますが、通常はVMが(例えばクライアントまたはサーバーを使用に依存-clientし、-serverパラメータ)と、システムメモリ上。

多くの場合client、デフォルト値は物理メモリの1/4または1GB(どちらか小さい方)です。

また、Java構成オプション(コマンドラインパラメーター)は-Xmx、を含む環境変数に「アウトソーシング」することができます。これにより、デフォルトを変更できます(つまり、新しいデフォルトを指定できます)。具体的には、JAVA_TOOL_OPTIONS環境変数はすべてのJavaツールによってチェックされ、存在する場合は使用されます(詳細はこちらこちら)。

次のコマンドを実行して、デフォルト値を確認できます。

java -XX:+PrintFlagsFinal -version

それは、あなたにloooongリストを与える-XmxであるMaxHeapSize-XmsですInitialHeapSize。出力をフィルタリングする|grepか(Linuxなど)、ファイルに保存して検索できるようにします。


11
小さな追加として、java -XX:+PrintCommandLineFlags現在のシステム情報に基づいてJVMによって選択されたヒープサイズ(およびその他の情報)を印刷するために実行できます
Cristian Vat 2015

1
@CristianVatはい、しかしパラメータはです-XX:+PrintFlagsFinal、あなたが提案したものは私には機能しません。答えにそれを追加します。
icza 2015

そうです、申し訳ありません-XX:+PrintFlagsFinalが、すべてが考慮された後にすべての情報が表示されるはずなので、申し訳ありません(手動オプションと人間工学を含む)。けれども-XX:+PrintCommandLineFlags私のJVM上で動作するようです(正確なバージョンに依存する場合があります)
クリスティアンバット

2
大きなボックスの場合、この「1 / 4RAM」の経験則は間違いなく当てはまりません。4ソケット、ソケットサーバーあたり64GB(つまり、256GB RAM)では、Xmxのデフォルトは最大32GBです。32GBは、この時点でのCompressedOopsの制限にも関連している可能性があります。
FauxFaux 2015年

2
これは、ヒープサイズに関連する行を表示:java -XX:+PrintFlagsFinal -version | grep HeapSize
user218867

37

あなたが言及したように、デフォルト-Xmxsize(最大ヒープサイズ)はシステム構成に依存します。

Java8clientは、物理メモリの1/64の大きい方Xmssize(最小HeapSize)を使用し、物理メモリの1/4の小さい方-Xmxsize(最大HeapSize)を使用します。

つまり、8GB RAMの物理メモリがある場合Xmssize、大きい方は8 *(1/6)、小さい方は-Xmxsize8 *(1/4)になります。

デフォルトのHeapSizeを確認できます

Windows

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Linux

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

これらのデフォルト値は、必要な量に上書きすることもできます。



docs.oracle.com/javase/8/docs/technotes/guides/vm/…このリンクによると、minimum / initialのデフォルトは1/6ではなく1/64です。「マシン上のマシンの物理メモリの
1/64の

15

驚いたことに、この質問には明確な文書化された答えがありません。おそらく、別のデータポイントが、答えを探している他の人に価値を提供するでしょう。CentOS(6.8,7.3)とJava 8(ビルド1.8.0_60-b27、64ビットサーバー)を実行している私のシステムでは:

デフォルトのメモリは物理メモリの1/4で、1GBに制限されません。

また、-XX:+PrintFlagsFinalSTDERRに出力するため、上記の他のユーザーが提示した現在のデフォルトメモリを判別するコマンドを次のように調整する必要があります。

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

以下は、64GBの物理RAMを搭載したシステムで返されます。

uintx MaxHeapSize                                  := 16873684992      {product}

16 GbのRAMを搭載した私のシステムでは:2069889024 = 2Gb。
david.perez 2017

Windows
764

最後にそれのための文書が見つかりました:stackoverflow.com/a/56036202/32453
rogerdpack

2

私のUbuntuVMでは、合計RAMが1048 MBで、次のように出力java -XX:+PrintFlagsFinal -version | grep HeapSizeされます uintx MaxHeapSize := 266338304。これは約266MBで、合計RAMの1/4です。


2
OpenJDKとOracleには異なる特性があるように見えます
-OpenJDK

1

2019年5月8日現在

JVMヒープサイズは、システム構成によって異なります。つまり、次のようになります。

a)クライアントjvmとサーバーjvm

b)32ビットと64ビット

リンク:

1)J2SE5.0からの更新:https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2)簡単な回答:https://docs.oracle.com/ javase / 8 / docs / technotes / guides / vm / gctuning / ergonomics.html
3)詳細な回答:https//docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4)クライアントとサーバー:https//www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

要約:( 上記のリンクから理解するのは難しいので、ここに要約します)

1)クライアントjvmのデフォルトの最大ヒープサイズは256mbです(例外があり、上記のリンクから読み取られます)。

2)サーバーjvmのデフォルトの最大ヒープサイズは32ビットで1 GB、64ビットで32 GBです(ここでも例外があります。リンクから読んでください)。

したがって、デフォルトの最大jvmヒープサイズは、上記のVMに応じて256mbまたは1gbまたは32gbです。


1
最後に、何が起こっているのかを説明する実際のドキュメントへのリンク。
rogerdpack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.