java-heap-size、width = 640、height = 337

この記事では、 `-XX:PrintFlagsFinal`を使ってヒープサイズの詳細を調べる方法を説明します。 Javaでは、デフォルトおよび最大ヒープ・サイズは、これに基づいて割り当てられます(http://www.oracle.com/technetwork/java/ergo5-140223.html[ergonomicsアルゴリズム)。

Heap sizes

Initial heap size of 1/64 of physical memory up to 1Gbyte

Maximum heap size of 1/4 of physical memory up to 1Gbyte

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

1. Javaメモリの概要

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

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

$ java -Xms512m -Xmx1024m JavaApp

  • 2。 Perm Gen Size ** ロードされたクラス定義とメタデータを保存する場所。大きなコードベースプロジェクトが読み込まれると、Perm Genのサイズが不足すると、一般的な `Java.Lang.OutOfMemoryError:PermGen`が発生します。

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

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

  • 3。 Java Stack Size ** Javaスレッドのサイズ。プロジェクトのスレッド処理が多い場合は、メモリ不足を避けるためにこのスタックサイズを減らしてください。 -Xss = Javaスレッドのスタックサイズを設定する

$ java -Xss512k JavaApp

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

2. Ubuntu

これはテスト環境です。

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ヒープサイズ

InitialHeapSize = 64781184バイト(61.7M)およびMaxHeapSize = 1038090240バイト(990M)。


  1. PermGenサイズ

PermSize = 21757952バイト(20.75M)、MaxPermSize = 174063616バイト(166M)


スレッドスタックサイズ

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ヒープサイズ

InitialHeapSize = 20655360バイト(19.69M)およびMaxHeapSize = 331350016バイト(316M)。


  1. PermGenサイズ

PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(82M)。


  1. Javaスタックサイズ

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ヒープサイズ

InitialHeapSize = 266634176バイト(256M)およびMaxHeapSize = 4266146816バイト(4068M)。


  1. PermGenサイズ

PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(823。

M)。


  1. Javaスタックサイズ

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ほとんどのJavaプロジェクトでは、スレッド用の512kで十分です。

$ 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.よくある質問

  • Q。 ** A. Javaコンパイラからの苦情を避け、 “-version”をあなたのJavaアプリケーション名に置き換えてください。

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

  • Q。 -XX:+ PrintCommandLineFlags?** + A.この

    -XX:+ PrintCommandLineFlags`は、VMのみで修正された値(この

    := `シンボルで示される)を出力するために使用されます。

7.結論

最後に、ヒープメモリー、パーマネントgem、スタックサイズのデフォルト値は各JVMと異なり、JVMがJavaアプリケーションに最適な値を割り当てるとは限りません。ベストプラクティスでは、メモリの詳細がわかり、それに応じて値を微調整します。

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

参考文献

メモリ管理ホワイトペーパー]。

https://blogs.oracle.com/jonthecollector/entry/presenting


the

permanent__generation[Oracle

永続的な世代を提示する]。

http://www.oracle.com/technetwork/java/ergo5-140223.html

[の人間工学

5.0 Java[tm]仮想マシン]。

JVMのメモリ構造

java.lang.OutOfMemoryError:PermGen space]。

https://community.jboss.org/wiki/OutOfMemoryExceptions

[JBoss

HotSpot VMのオプション]。

-XX:PrintFlagsFinal

JVMフラグ – 第3部(すべてのXXフラグとその値を出力する)]。

http://q-redux.blogspot.com/2011/01/inspecting-hotspot-jvm-options.html

[Inspecting

  • グローバルソースコード]