Javaヒープ・メモリー・サイズを調べる
この記事では、 `-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は次のデフォルト値を割り当てました。
-
Javaヒープサイズ
InitialHeapSize = 64781184バイト(61.7M)およびMaxHeapSize = 1038090240バイト(990M)。
-
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)
-
Javaヒープサイズ
InitialHeapSize = 20655360バイト(19.69M)およびMaxHeapSize = 331350016バイト(316M)。
-
PermGenサイズ
PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(82M)。
-
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)
-
Javaヒープサイズ
InitialHeapSize = 266634176バイト(256M)およびMaxHeapSize = 4266146816バイト(4068M)。
-
PermGenサイズ
PermSize = 21757952バイト(20.75M)、MaxPermSize = 85983232バイト(823。
M)。
-
Javaスタックサイズ
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ほとんどの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のメモリ構造
メモリの問題]。
http://stackoverflow.com/questions/1634216/what-is-permsize-in-java
[StackOverflow
: What is ‘PermSize’ in Java?].
http://stackoverflow.com/questions/4827544/java-lang-outofmemoryerror-permgen-space
[StackOverflow
: java.lang.OutOfMemoryError: PermGen space].
http://www.freshblurbs.com/blog/2005/05/19/explaining-java-lang-outofmemoryerror-permgen-space.html
[Explaining
java.lang.OutOfMemoryError:PermGen space]。
https://community.jboss.org/wiki/OutOfMemoryExceptions
[JBoss
OutOfMemoryExceptions]。
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
[Java
HotSpot VMのオプション]。
-XX:PrintFlagsFinal
JVMフラグ – 第3部(すべてのXXフラグとその値を出力する)]。
http://q-redux.blogspot.com/2011/01/inspecting-hotspot-jvm-options.html
[Inspecting
HotSpot JVMオプション]。
http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/tip/src/share/vm/runtime/globals.hpp
[OpenJDK
-
グローバルソースコード]