-Xmxn
Javaコマンドラインからオプションを省略した場合、デフォルト値が使用されます。Javaのドキュメントによると
「デフォルト値は、システム構成に基づいて実行時に選択されます」
どのシステム構成設定がデフォルト値に影響しますか?
-Xmxn
Javaコマンドラインからオプションを省略した場合、デフォルト値が使用されます。Javaのドキュメントによると
「デフォルト値は、システム構成に基づいて実行時に選択されます」
どのシステム構成設定がデフォルト値に影響しますか?
回答:
Windowsでは、次のコマンドを使用して、アプリケーションが実行されているシステムのデフォルトを確認できます。
java -XX:+ PrintFlagsFinal -version | findstr HeapSize
オプションMaxHeapSize
(-Xmx
)とInitialHeapSize
を探します-Xms
。
Unix / Linuxシステムでは、次のことができます
java -XX:+ PrintFlagsFinal -version | grep HeapSize
結果の出力はバイト単位であると思います。
InitialHeapSize = 262803264
、MaxHeapSize = 4206886912
これは約256 MBであり、私が間違っていない場合は4 GBです。これは、すべてのJVMが-Xms256m -Xmx4g
オプション付きで起動されたかのように起動することを意味しますか?
java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
、の長い「使用法」テキストが抑制されstderr
ます。
Java SE 5の場合:Garbage Collector Ergonomicsによると[Oracle]:
初期ヒープサイズ:
マシン上のマシンの物理メモリの1/64より大きい、または妥当な最小値。J2SE 5.0以前は、デフォルトの初期ヒープサイズは妥当な最小値でしたが、プラットフォームによって異なります。-Xmsコマンドラインオプションを使用して、このデフォルトを上書きできます。
最大ヒープサイズ:
物理メモリの4分の1または1 GBの小さい方。J2SE 5.0以前は、デフォルトの最大ヒープサイズは64MBでした。-Xmxコマンドラインオプションを使用して、このデフォルトを上書きできます。
更新:
Tom Andersonのコメントで指摘されているように、上記はサーバークラスのマシンに関するものです。5.0 JavaTM仮想マシンの人間工学から:
J2SEプラットフォームバージョン5.0では、サーバークラスマシンと呼ばれるマシンのクラスは、
- 2つ以上の物理プロセッサ
- 2Gバイト以上の物理メモリー
Windowsオペレーティングシステムのバージョンを実行している32ビットプラットフォームを除いて。他のすべてのプラットフォームでは、デフォルト値はバージョン1.4.2のデフォルト値と同じです。
J2SEプラットフォームバージョン1.4.2では、デフォルトで次の選択が行われました
- 初期ヒープサイズは4Mバイト
- 最大ヒープサイズは64Mバイト
Javaの8以上かかる1 /第64回あなたのためのあなたの物理メモリをXmssize(最小ヒープサイズ)未満1/4あなたのためのあなたの物理メモリの-Xmxsize(最大ヒープサイズ)。
デフォルトのJavaヒープサイズは次の方法で確認できます。
Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Linux:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
どのシステム構成設定がデフォルト値に影響しますか?
マシンの物理メモリとJavaバージョン。
これは、Java 6 update 18で変更されました。
1 GBを超える物理メモリ(最近ではかなり一般的)があるとすると、常にサーバーvmの物理メモリの1/4になります。
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
エルネストは正しいです。彼が投稿したリンクによると[1]:
クライアントJVMヒープ構成の更新
クライアントJVMで...
デフォルトの最大ヒープサイズは、物理メモリの半分から最大192メガバイトの物理メモリサイズです。それ以外の場合は、物理メモリの4分の1から最大1ギガバイトの物理メモリサイズです。
たとえば、マシンに128メガバイトの物理メモリがある場合、最大ヒープサイズは64メガバイトであり、1ギガバイト以上の物理メモリの結果、最大ヒープサイズは256メガバイトになります。
プログラムがそれを必要とするのに十分なオブジェクトを作成しない限り、最大ヒープサイズは実際にはJVMによって使用されません。初期ヒープサイズと呼ばれるはるかに少ない量が、JVMの初期化中に割り当てられます。...
- ...
- サーバーJVMヒープ構成の人間工学は、クライアントと同じです。ただし、32ビットJVMのデフォルトの最大ヒープサイズは1ギガバイトで、4ギガバイトの物理メモリサイズに対応します。64ビットJVMの場合は、32ギガバイトです。 128ギガバイトの物理メモリサイズに。
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
IBM JVMの場合、コマンドは次のとおりです。
java -verbose:sizes -version
IBM SDK for Java 8の詳細:http : //www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ?lang = en
最終的に!
Java 8u191以降、次のオプションがあります。
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
使用可能な物理RAMの割合としてヒープのサイズを設定するために使用できます。(これは、カーネルが使用するものを差し引いたRAMと同じです)。
Java8 u191のリリースノートを参照してくださいしてください。オプションはDockerの見出しの下に記載されていますが、実際にはDocker環境でも従来の環境でも適用されます。
のデフォルト値 MaxRAMPercentage
は25%です。これは非常に保守的です。
私自身のルール:ホストが特定のJavaアプリケーションの実行に専念している場合、問題なく劇的に増加できます。Linuxを使用していて、標準デーモンのみを実行し、RAMを1 GB前後のどこかからインストールしている場合、JVMのヒープに75%を使用することをためらわないでしょう。繰り返しますが、これは使用可能な RAMの75%であり、インストールされているRAMではありません。残っているのは、ホストで実行されている可能性のある他のユーザーランドプロセスと、JVMが必要とする他のタイプのメモリ(スタックなど)です。まとめると、これは通常、残りの25%にうまく収まります。明らかに、さらに多くのRAMがインストールされている場合、75%の方がより安全です。(JDKの皆さんがラダーを指定できるオプションを実装していたと思います)
MaxRAMPercentage
オプションの設定は次のようになります。
java -XX:MaxRAMPercentage=75.0 ....
これらのパーセント値は「double」タイプであるため、小数点を使用して指定する必要があることに注意してください。「75.0」の代わりに「75」を使用すると、やや奇妙なエラーが発生します。
デフォルト値は、システム構成に基づいて実行時に選択されます
デフォルトのヒープサイズ
コマンドラインで初期ヒープサイズと最大ヒープサイズを指定しない限り、それらはマシンのメモリ量に基づいて計算されます。
クライアントJVMのデフォルトの初期および最大ヒープサイズ:
デフォルトの最大ヒープサイズは、物理メモリの半分から最大192メガバイト(MB)の物理メモリサイズです。それ以外の場合は、物理メモリの4分の1から最大1ギガバイト(GB)の物理メモリサイズです。
サーバーJVMのデフォルトの初期および最大ヒープサイズ:
32ビットJVMでは、4 GB以上の物理メモリがある場合、デフォルトの最大ヒープサイズは最大1 GBになります。64ビットJVMでは、128 GB以上の物理メモリがある場合、デフォルトの最大ヒープサイズは最大32 GBになります。
どのシステム構成設定がデフォルト値に影響しますか?
フラグ-Xms(初期ヒープサイズ)および-Xmx(最大ヒープサイズ)を使用して、初期および最大ヒープサイズを指定できます。アプリケーションがうまく機能するために必要なヒープ量がわかっている場合は、-Xmsと-Xmxを同じ値に設定できます。
Xms
およびXmx
Java仮想マシン(JVM)のフラグです。
Xms
:initial and minimum
JVMheap size
Format
: -Xmx<size>[g|G|m|M|k|K]
Default Size
:
-server
モード:空き物理メモリの25%、8 MB以上64 MB以下-client mode
:空き物理メモリの25%、8 MB以上16 MB以下Typical Size
:
-Xms128M
-Xms256M
-Xms512M
Function
/ Effect
:
Xms
サイズのメモリを割り当てて開始しますXmx
:maximum
JVMheap size
Format
: -Xmx<size>[g|G|m|M|k|K]
Default Size
:
<= R27.2
Windows
:まで75%
の合計物理メモリ1GB
Linux/Solaris
:50%
使用可能な物理メモリの最大1GB
>= R27.3
Windows X64
:まで75%
の合計物理メモリ2GB
Linux/Solaris X64
:50%
使用可能な物理メモリの最大2GB
Windows x86
:まで75%
の合計物理メモリ1GB
Linux/Solaris X86
:50%
使用可能な物理メモリの最大1GB
Typical Size
:
-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/ Effect
:
Xmx
サイズのメモリの
使用を許可しますXmx
、java.lang.OutOfMemoryError
OutOfMemoryError
?
Xmx
値を
超える-Xmx4g
へ-Xmx8g
公式ドキュメントを参照してください:-Xコマンドラインオプション
いくつかのパラメーターが生成サイズに影響します。次の図は、ヒープ内のコミット済みスペースと仮想スペースの違いを示しています。仮想マシンの初期化時に、ヒープ用のスペース全体が予約されます。予約領域のサイズは-Xmx
オプションで指定できます。-Xms
パラメータの値がパラメータの値よりも小さい場合、-Xmx
予約されているすべての領域がすぐに仮想マシンにコミットされるわけではありません。この図では、コミットされていないスペースに「仮想」というラベルが付いています。ヒープのさまざまな部分(永続的な世代、保有期間の世代、および若い世代)は、必要に応じて仮想空間の限界まで拡張できます。
デフォルトでは、仮想マシンは各コレクションでヒープを拡大または縮小して、各コレクションでライブオブジェクトに対する空き領域の割合を特定の範囲内に維持しようとします。このターゲット範囲は、パラメーター- XX:MinHeapFreeRatio=<minimum>
およびによってパーセンテージとして設定され-XX:MaxHeapFreeRatio=<maximum>
、合計サイズは-Xms<min>
、-Xmx<max>
ます。
パラメータのデフォルト値
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
64ビットシステムのヒープサイズパラメータのデフォルト値は、約30%拡大されています。この増加は、64ビットシステムでのオブジェクトのより大きなサイズを補うためのものです。
これらのパラメーターを使用すると、世代の空きスペースの割合が40%を下回ると、世代の最大許容サイズまで、40%の空きスペースを維持するように世代が拡張されます。同様に、空き領域が70%を超えると、世代の最小サイズに従って、空き領域が70%だけになるように世代が縮小されます。
大規模なサーバーアプリケーションでは、多くの場合、これらのデフォルトで2つの問題が発生します。最初のヒープは小さく、多くの主要なコレクションでサイズを変更する必要があるため、1つは遅い起動です。さらに差し迫った問題は、デフォルトの最大ヒープサイズが、ほとんどのサーバーアプリケーションにとって不当に小さいことです。サーバーアプリケーションの経験則は次のとおりです。