Javaヒープ・メモリー・サイズを調べる

Javaヒープメモリサイズを調べる

java-heap-size

この記事では、-XX:+PrintFlagsFinalを使用してヒープサイズの詳細を確認する方法を説明します。 Javaでは、デフォルトおよび最大ヒープサイズはこれに基づいて割り当てられます–ergonomics algorithm

ヒープサイズ
最大1Gバイトの物理メモリの1/64の初期ヒープサイズ
最大1Gバイトの物理メモリの1/4の最大ヒープサイズ

ただし、上記のアルゴリズムは参照用であり、VMによって異なる場合があります。

1. Javaメモリの概要

Javaメモリ構造の簡単なレビュー:

1. Java Heap Size
Javaアプリケーションによって作成されたオブジェクトを格納する場所。これは、Javaアプリケーションによって使用されるメモリであるガベージコレクションが行われる場所です。 重いJavaプロセスの場合、ヒープサイズが不十分だと、一般的なjava.lang.OutOfMemoryError: Java heap spaceが発生します。

-Xms - Set initial Java heap size
-Xmx - Set maximum Java heap size

$ java -Xms512m -Xmx1024m JavaApp

2. Perm Gen Size
ロードされたクラス定義とメタデータを格納する場所。 大規模なコードベースプロジェクトがロードされる場合、Perm Genサイズが不十分であると、人気のあるJava.Lang.OutOfMemoryError: PermGenが発生します。

-XX:PermSize - Set initial PermGen Size.
-XX:MaxPermSize - Set the maximum PermGen Size.

$ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp

3. Java Stack Size
Javaスレッドのサイズ。 プロジェクトに多数のスレッド処理がある場合は、メモリ不足を回避するためにこのスタックサイズを減らしてみてください。
-Xss = set java thread stack size

$ java -Xss512k JavaApp

Note
ヒープサイズ、perm gen、またはスタックサイズのデフォルト値は、JVMによって異なります。 ベストプラクティスは、常に独自の価値を定義することです。

2. ウブンツ

これがテスト環境です。

OS  : Ubuntu 13 (64 bits) (Under VirtualBox)
RAM : 4G
CPU : 1 x Processors
JDK : 1.7.0_51
$ java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

    uintx InitialHeapSize                          := 64781184        {product}
    uintx MaxHeapSize                              := 1038090240      {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 174063616       {pd product}
     intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.13.10.1)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

上記の環境では、JVMは次のデフォルト値を割り当てました。

  1. Java heap size
    InitialHeapSize = 64781184バイト(61.7M)およびMaxHeapSize = 1038090240バイト(990M)。

  2. PermGen Size
    PermSize = 21757952バイト(20.75M)、MaxPermSize = 174063616バイト(166M)

  3. Thread Stack Size
    ThreadStackSize = 1024キロバイト(1M)

割り当てられたヒープメモリサイズは、人間工学の結果に非常に近いです。

#ergonomics algorithm
Initial heap size = 4096M/64 = 64M
Maximum heap size = 4096M/4 = 1024M

3. Mac OSX

これがテスト環境です。

OS  : Mac OSX 10.9
RAM : 8G
CPU : 4 x Processors
JDK : 1.7.0_05
$ java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

    uintx InitialHeapSize                          := 20655360        {product}
    uintx MaxHeapSize                              := 331350016       {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 85983232        {pd product}
     intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)
  1. Java heap size
    InitialHeapSize = 20655360バイト(19.69M)およびMaxHeapSize = 331350016バイト(316M)。

  2. PermGen Size
    PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(82M)。

  3. Java Stack Size
    ThreadStackSize = 1024キロバイト(1M)

次の人間工学の結果と比較した場合、割り当てられたヒープメモリサイズはまったく無関係です。

#ergonomics algorithm
Initial heap size = 8192M/64 = 128M
Maximum heap size = 8192M/4 = 2048M

4. Windows

Windowsにはgrepはありませんが、代わりにfindstrを使用します。

これがテスト環境です。

OS  : Windows 8
RAM : 16G
CPU : 8 x Processors
JDK : 1.7.0_40
C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

    uintx InitialHeapSize                          := 266634176       {product}
    uintx MaxHeapSize                              := 4267704320      {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 85983232        {pd product}
     intx ThreadStackSize                           = 0               {pd product}
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
  1. Java heap size
    InitialHeapSize = 266634176バイト(256M)およびMaxHeapSize = 4266146816バイト(4068M)。

  2. PermGen Size
    PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(823。 M).

  3. Java Stack Size
    ThreadStackSize = 0キロバイト。 (変…)

割り当てられたヒープメモリサイズは、人間工学の結果とほぼ同じです。

#ergonomics algorithm
Initial heap size = 16384/64 = 256M
Maximum heap size = 16384/4 = 4096M

5. 推奨Javaメモリ

以下は、小規模から中規模のJavaアプリケーションに推奨される値です。

  1. ヒープ= -Xms512m -Xmx1024m

  2. PermGen = -XX:PermSize = 64m -XX:MaxPermSize = 128m

  3. スレッド= -Xss512k

P.S For most Java projects, 512k for a thread is sufficient.

$ java -XX:+PrintFlagsFinal -Xms512m -Xmx1024m -Xss512k -XX:PermSize=64m -XX:MaxPermSize=128m
    -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

    uintx InitialHeapSize                          := 536870912       {product}
    uintx MaxHeapSize                              := 1073741824      {product}
    uintx PermSize                                 := 67108864        {pd product}
    uintx MaxPermSize                              := 134217728       {pd product}
     intx ThreadStackSize                          := 512             {pd product}

6. FAQs

Q. What is -version?
A。 Javaコンパイラからの苦情を避け、「-version」をJavaアプリケーション名に置き換えます。

$ java -XX:+PrintFlagsFinal {your-java-program} | grep HeapSize

Q. What is -XX:+PrintCommandLineFlags?
A。 この-XX:+PrintCommandLineFlagsは、VMによってのみ変更された値を出力するために使用されます(この:=記号で示されます)。

7. 結論

最後に、ヒープメモリ、perm gem、およびスタックサイズのデフォルト値は各JVMとは異なります。JVMがJavaアプリケーションに最適な値を割り当てることを期待しないでください。 ベストプラクティスはメモリの詳細を確認し、それに応じて値を微調整します。

いくつかを見つけて共有し、あなたのコメントを教えてください。