web-dev-qa-db-ja.com

デフォルトのJavaヒープサイズはどのように決定されますか?

Javaコマンドラインから-Xmxnオプションを省略した場合は、デフォルト値が使用されます。 Javaのドキュメントによると

「デフォルト値はシステム構成に基づいて実行時に選択されます」

どのシステム構成設定がデフォルト値に影響しますか?

356
Richard Dorman

Windowsでは、次のコマンドを使用して、アプリケーションが実行されているシステム上のデフォルトを調べることができます。

Java -XX:+ PrintFlagsFinal -version | findstr HeapSize

オプションMaxHeapSize-Xmx用)とInitialHeapSize-Xmsを探します。

Unix/Linuxシステムでは、次のことができます。

Java -XX:+ PrintFlagsFinal -version | grep HeapSize

結果の出力はバイト単位であると思います。

447
stones333

によると、Garbage Collector Ergonomics [Oracle]

初期ヒープサイズ:

マシン上のマシンの物理メモリの1/64以上、またはそれなりの最小値。 J2SE 5.0より前は、デフォルトの初期ヒープサイズは妥当な最小値であり、プラットフォームによって異なります。このデフォルトは、-Xmsコマンドラインオプションを使用して上書きできます。

最大ヒープサイズ:

物理メモリの1/4以下、または1GB。 J2SE 5.0より前のデフォルトの最大ヒープサイズは64MBでした。このデフォルトは、-Xmxコマンドラインオプションを使用して上書きできます。

更新:

Tom Andersonが彼のコメントで指摘したように、上記はサーバークラスのマシン用です。 From 5.0 JavaTM仮想マシンの人間工学

J2SEプラットフォームバージョン5.0では、サーバークラスのマシンと呼ばれるマシンのクラスは、次のように定義されています。

  • 2台以上の物理プロセッサ
  • 2Gバイト以上の物理メモリー

windowsオペレーティングシステムのバージョンを実行している32ビットプラットフォームを除く。他のすべてのプラットフォームでは、デフォルト値はバージョン1.4.2のデフォルト値と同じです。

J2SEプラットフォームのバージョン1.4.2では、デフォルトで次のように選択されていました。

  • 初期ヒープサイズ4Mバイト
  • 最大ヒープサイズ64Mバイト
104
dogbane

これは Java 6 update 18 で変更されています。

1 GB 以上の物理メモリがあると仮定すると(最近ではごく一般的になっています)、それは常に物理メモリの1/4です。

27
ernesto

Java 8は、Xmssize用の物理メモリの1/6以上(Minimum HeapSize)、-Xmxsize用の物理メモリの1/4以下(Maximum HeapSize)です。

デフォルトのJavaヒープサイズ を確認できます。

ウィンドウズ

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

- Linux

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

どのシステム構成設定がデフォルト値に影響しますか?

あなたの 物理メモリとJavaのバージョン。

16
Sarat Chandra

アーネストは正しいです。彼が投稿したリンクによると、[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

15
apl

デフォルト値はシステム構成に基づいて実行時に選択されます。

ドキュメントを見てください ページ

デフォルトのヒープサイズ

初期および最大ヒープサイズがコマンドラインで指定されていない限り、それらはマシン上のメモリの量に基づいて計算されます。

  1. クライアントJVMのデフォルトの初期および最大ヒープサイズ

    デフォルトの最大ヒープサイズは、物理メモリの半分から最大192メガバイト(MB)まで、それ以外の場合、{物理メモリの4分の1から最大1ギガバイトまでの物理メモリサイズ( GB)

  2. サーバーJVMのデフォルトの初期および最大ヒープサイズ

    32ビットJVMでは、デフォルトの最大ヒープサイズは、4 GB以上の物理メモリがある場合は最大1 GBまで可能ですです。 64ビットJVMでは、128 GB以上の物理メモリーがある場合、デフォルトの最大ヒープサイズは最大32 GBまで可能です

どのシステム構成設定がデフォルト値に影響しますか?

フラグ-Xms(初期ヒープサイズ)および-Xmx(最大ヒープサイズ)を使用して、初期および最大ヒープサイズを指定できます。 )アプリケーションがうまく機能するために必要なヒープ量がわかっている場合は、-Xms-Xmxを同じ値に設定できます。

7
Ravindra babu

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 = ja

7
n0mer

多数のパラメーターが世代サイズに影響します。次の図は、ヒープ内のコミット済みスペースと仮想スペースの違いを示しています。仮想マシンの初期化時に、ヒープ用のスペース全体が予約されています。予約済みスペースのサイズは、-Xmxオプションで指定できます。 -Xmsパラメーターの値が-Xmxパラメーターの値より小さい場合、予約されているスペースのすべてが即時に仮想マシンにコミットされるわけではありません。この図では、コミットされていないスペースに「仮想」というラベルが付いています。ヒープのさまざまな部分(永続世代、永続世代、および若い世代)は、必要に応じて仮想スペースの限界まで拡張できます。

enter image description here

デフォルトでは、仮想マシンは各コレクションのヒープを増減して、各コレクションのライブオブジェクトに対する空き領域の割合を特定の範囲内に保とうとします。このターゲット範囲は、パラメーター-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つは起動が遅いことです。もっと差し迫った問題は、デフォルトの最大ヒープサイズがほとんどのサーバーアプリケーションにとって不当に小さいことです。サーバーアプリケーションの経験則は次のとおりです。

  • 一時停止に問題がない限り、仮想マシンにできるだけ多くのメモリを割り当ててみてください。デフォルトのサイズ(64MB)は小さすぎることがよくあります。
  • -Xmsと-Xmxを同じ値に設定すると、仮想マシンから最も重要なサイズ決定を削除することで予測可能性が向上します。ただし、仮想マシンは、あなたが悪い選択をした場合、それを補うことができません。
  • 一般に、割り当ては並列化できるため、プロセッサの数を増やすにつれてメモリを増やします。

    全文記事 があります

4
theodor

Xmsname__およびXmxname__は、Java仮想マシン(JVM)のフラグです。

  • Xmsname__:initial and minimum JVM heap size
    • Formatname__:-Xmx<size>[g|G|m|M|k|K]
    • Default Size
      • -serverモード:空き物理メモリの25%、8MB以上、64MB以下
      • -client mode:25%の空き物理メモリ、8MB以上、16MB以下
    • Typical Size
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Functionname __/Effectname __:
      • - > JVMはXmsname__サイズのメモリーの割り当てで開始
  • Xmxname__:maximumJVM heap size
    • Formatname__:-Xmx<size>[g|G|m|M|k|K]
    • Default Size
      • <= R27.2
        • Windowsname__:75%までの総物理メモリの1GB
        • Linux/Solaris50%までの利用可能な物理メモリの1GB
      • >= R27.3
        • Windows X6475%までの総物理メモリの2GB
        • Linux/Solaris X6450%までの利用可能な物理メモリの2GB
        • Windows x8675%までの総物理メモリの1GB
        • Linux/Solaris X8650%までの利用可能な物理メモリの1GB
    • Typical Size
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Functionname __/Effectname __:
      • - > JVMは最大Xmxname__サイズのメモリを使用できます。
        • Xmxname__を超えると、Java.lang.OutOfMemoryError になります。
          • OutOfMemoryErrorname__を修正する方法?
            • Xmxname__の値を超えています
              • 例:-Xmx4gから-Xmx8g

より詳しく

公式ドキュメントを見てください: -Xコマンドラインオプション

1
crifan