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


421

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

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

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


1
システム構成とは、a)クライアントjvmとサーバーjvm b)32ビットvs 64ビットを意味します。リンク:1)J2SE5.0からの更新docs.oracle.com/javase/6/docs/technotes/guides/vm/…2 )簡単な回答:docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3)詳細な回答:docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/…4 )クライアントとサーバー:javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Vyshnav Ramesh Thrissur

2
上記のリンクから理解するのは難しいです。したがって、ここでそれらを要約します。クライアントjvmの最大ヒープサイズは256MBです(例外があり、上記のリンクから読み取ります)。32ビットのサーバーjvmの最大ヒープサイズは1 GB、64ビットは32 GBです(ここでも例外があります。リンクからお読みください)。つまり、256MBまたは1GBまたは32GB
Vyshnav Ramesh Thrissur

回答:


507

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

java -XX:+ PrintFlagsFinal -version | findstr HeapSize

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

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

java -XX:+ PrintFlagsFinal -version | grep HeapSize

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


3
私はこのような素晴らしいオプションを望んでいましたが、IBMのJava 6 VMを使用して私にはうまくいきませんでした。
Matt Lavin 2013年

すごい!これらすべてのデフォルトオプションでプレイできますか?それぞれに対応するENV変数は何ですか?
Elist 2013

28
Linuxでの私の場合InitialHeapSize = 262803264MaxHeapSize = 4206886912これは約256 MBであり、私が間違っていない場合は4 GBです。これは、すべてのJVMが-Xms256m -Xmx4gオプション付きで起動されたかのように起動することを意味しますか?
Yuriy Nakonechnyy 2014年

9
Windowsシステムの場合:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
@matanster Linuxでは-version、の長い「使用法」テキストが抑制されstderrます。
フランクリン・ユー

115

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バイト

4
注意:クライアントクラスではなく、サーバークラスのマシン用です。それらの用語を定義するjava.sun.com/docs/hotspot/gc5.0/ergo5.htmlと併せてそのドキュメントを読み、クライアントクラスのマシンで何が起こるかを読む必要があります。dogbane、関連する文章を引用するために答えを編集することを謙虚に提案してもいいですか?
トムアンダーソン

3
これは2012年の途方もなく低いデフォルトです。64メガバイトに収まる深刻なアプリケーションはほとんどありません。
Mark E. Haase

1
エルネストの10月30日、クライアントマシンの2012年の答えJavaの後に6アップデート18を参照してください
アンディ・トーマス

また、「ヒープサイズに指定された境界と分数はJ2SE 5.0に適しています。コンピュータがより強力になるにつれて、後続のリリースでは異なる可能性があります。」
Lodovik、2015年

ちなみに、このアルゴリズムはParallel Garbage Collector専用です。
Mike Argyriou

45

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バージョン。


5
1/6ではなく1/64じゃないですか?
Vyshnav Ramesh Thrissur

1
ええXmssize(最小HeapSize / InitialHeapSize)は物理メモリの1/64を超え、Xmxsize(最大HeapSize / MaxHeapSize)は物理メモリの1/4未満です。(私のMacのForex、RAMが16GBの場合、uintx InitialHeapSize:= 268435456 {product} uintx MaxHeapSize:= 4294967296 {product}を取得しています。つまり、Xmsは268 MB、Xmxは4.29 GB
sjethvani

1
回答を編集してください。それは1/64ではなく、1/6です。
emeraldhieu

35

これは、Java 6 update 18で変更されました。

1 GBを超える物理メモリ(最近ではかなり一般的)があるとすると、常にサーバーvmの物理メモリの1/4になります。


8
不正解です。リンク先のページには次のように記載されていますgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Paolo Fulgoni、2014年

5
5 GBの物理メモリを搭載したLinuxマシンで確認しました。デフォルトの最大ヒープは1.5GBと表示されます
Ernesto

1
@PaoloFulgoniいいえ、私が今観察しているもう1つの実用的な例:129Gバイトの物理メモリは32Gバイトの最大ヒープサイズになります
Kirill

これが正しい理由についてのaplの回答を参照してください:stackoverflow.com/a/13310792/32453も参照してくださいstackoverflow.com/a/56036202/32453
rogerdpack

16

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



8

最終的に!

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」を使用すると、やや奇妙なエラーが発生します。


7

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

ドキュメンテーションページを見てください

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

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

  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を同じ値に設定できます。


5

XmsおよびXmxJava仮想マシン(JVM)のフラグです。

  • Xmsinitial and minimumJVMheap 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
      • -> JVMはXmsサイズのメモリを割り当てて開始します
  • XmxmaximumJVMheap size
    • Format-Xmx<size>[g|G|m|M|k|K]
    • Default Size
      • <= R27.2
        • Windows:まで75%の合計物理メモリ1GB
        • Linux/Solaris50%使用可能な物理メモリの最大1GB
      • >= R27.3
        • Windows X64:まで75%の合計物理メモリ2GB
        • Linux/Solaris X6450%使用可能な物理メモリの最大2GB
        • Windows x86:まで75%の合計物理メモリ1GB
        • Linux/Solaris X8650%使用可能な物理メモリの最大1GB
    • Typical Size
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/ Effect
      • -> JVMは最大Xmxサイズのメモリの 使用を許可します
        • 超えた場合Xmxjava.lang.OutOfMemoryError
          • 修正するにはOutOfMemoryError
            • Xmx値を 超える
              • 例えば:から-Xmx4g-Xmx8g

もっと詳しく

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


JRockit JVMの場合はそうではありませんか?(オラクルのホットスポットJVMとは対照的に)
peterh

4

いくつかのパラメーターが生成サイズに影響します。次の図は、ヒープ内のコミット済みスペースと仮想スペースの違いを示しています。仮想マシンの初期化時に、ヒープ用のスペース全体が予約されます。予約領域のサイズは-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つは遅い起動です。さらに差し迫った問題は、デフォルトの最大ヒープサイズが、ほとんどのサーバーアプリケーションにとって不当に小さいことです。サーバーアプリケーションの経験則は次のとおりです。

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

    記事全文があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.