Javaヒープメモリサイズを調べる
この記事では、-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は次のデフォルト値を割り当てました。
-
Java heap size
InitialHeapSize = 64781184バイト(61.7M)およびMaxHeapSize = 1038090240バイト(990M)。 -
PermGen Size
PermSize = 21757952バイト(20.75M)、MaxPermSize = 174063616バイト(166M) -
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)
-
Java heap size
InitialHeapSize = 20655360バイト(19.69M)およびMaxHeapSize = 331350016バイト(316M)。 -
PermGen Size
PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(82M)。 -
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)
-
Java heap size
InitialHeapSize = 266634176バイト(256M)およびMaxHeapSize = 4266146816バイト(4068M)。 -
PermGen Size
PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(823。 M). -
Java Stack Size
ThreadStackSize = 0キロバイト。 (変…)
割り当てられたヒープメモリサイズは、人間工学の結果とほぼ同じです。
#ergonomics algorithm Initial heap size = 16384/64 = 256M Maximum heap size = 16384/4 = 4096M
5. 推奨Javaメモリ
以下は、小規模から中規模のJavaアプリケーションに推奨される値です。
-
ヒープ= -Xms512m -Xmx1024m
-
PermGen = -XX:PermSize = 64m -XX:MaxPermSize = 128m
-
スレッド= -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アプリケーションに最適な値を割り当てることを期待しないでください。 ベストプラクティスはメモリの詳細を確認し、それに応じて値を微調整します。
いくつかを見つけて共有し、あなたのコメントを教えてください。