tech_memo / java / JVM


tech_memo/java

CodeCacheFlusing?による性能劣化

Arrays.sortとCollections.sortのアルゴリズム変更

JVM Option list

JDKバージョンごとの、各オプションの一覧

JVM Optionのデフォルト値の確認

[tme@sv13 ~]$ java -XX:+PrintFlagsFinal 
[Global flags]
    uintx AdaptivePermSizeWeight                    = 20              {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4               {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10              {product}
~ 略 ~
  • 他のオプションとの組み合わせで、デフォルト値の変わるオプションがある
    • Heap31GBの場合
      [tme@sv13 ~]$ java -Xmx31g -XX:+PrintFlagsFinal | grep UseCompressedOops
           bool UseCompressedOops                        := true            {lp64_product}
    • Heap32GBの場合
      [tme@sv13 ~]$ java -Xmx32g -XX:+PrintFlagsFinal | grep UseCompressedOops
           bool UseCompressedOops                        := false            

JVMメモリ空間構成

GC発生要因

  • http://www.atmarkit.co.jp/ait/articles/1005/13/news095.html
    1.Copy GCの発生要因 
     1.Eden領域へのJavaオブジェクトの配置で空き領域が不足
    
    2.Full GCの発生要因 
     1.上記1−1のときに、Old領域の最大値に対する未使用メモリサイズよりもNew領域で使用しているメモリサイズが大きい
     2.New領域とOld領域のそれぞれの未使用メモリサイズよりも、大きなメモリサイズのJavaオブジェクトの配置要求が発生
     3.Copy GC実施の結果、確保済みのOld領域での未使用メモリサイズが10000bytesを下回る
     4.Copy GC実施の結果、Old領域にオブジェクトが移動し、確保済みOld領域の拡張が発生
     5.Permanent領域に割り当てたいメモリサイズが確保済みPermanent領域の未使用メモリサイズを上回る

JVM Option

一般Option

  • -Xmn(-XX:NewSize?)or -XX:NewRatio?
    New世代領域に割り当てるサイズを指定。
    NewRatioはOld世代領域との比率で指定し、NewSizeはサイズで指定
    
    default -XX:NewRatio=12
  • -XX:SurvivorRatio?
    Eden領域とSurvivor領域のサイズを比率で指定
    コンカレントGC使用時はデフォルト1024
  • -XX:MaxTenuringThreshold?
    New世代領域において、オブジェクトがこの値で指定する回数のマイナーGCを超えて生き残ると、Old世代領域に移動
    コンカレントGCを使用すると、デフォルトは0
  • -XX:TargetSurvivorRatio?
    Survivor領域がいっぱいと判断される使用率
    Defaultは50%

コンカレントGC特化のオプション

  • -XX:+UseConcMarkSweepGC
    コンカレントGCの有効化
  • -XX:+CMSParallelRemarkEnabled? (動作させるマシンのCPUが2個以上かつ物理メモリが2Gbytes以上の場合には、自動設定される)
    メジャーGCのRemarkフェイズをマルチスレッドで実行
  • -XX:+UseParNewGC (動作させるマシンのCPUが2個以上かつ物理メモリが2Gbytes以上の場合には、自動設定される)
    マイナーGCをマルチスレッドで実行

コンカレントGC

基本強化

JAVA_OPTS="-server -Xmx8g -Xms8g -Xmn4g -XX:MaxNewSize=4g -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:SurvivorRatio=2 -XX:TargetSurvivorRatio=50 -XX:MaxTenuringThreshold=32 -Xss512k -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -XX:+UseCompressedOops -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.net.preferIPv4Stack=true"

GCログ出力

JAVA_OPTS="$JAVA_OPTS -Xloggc:/home/myuser/myapp/gc_log/gc.log"
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails"
  • rotate
    -Xloggc:/tmp/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=1048576