oinume journal

Scratchpad of what I learned

JVMのオススメ起動オプション

なんか秘伝のタレみたいになってきたので後世のために共有。

前提

  • Webアプリケーションを想定
  • TomcatなりJettyなりがListenするポートは外部からはアクセスできない

※-Xms -Xmx -Xmn あたりは搭載しているメモリ容量によって変える、-XX:MaxPermSize -XX:PermSizeは384mあれば十分だと思うけどロードするクラスの数次第なので要調整。

NOW=`date "+%Y%m%d-%H%M%S"`

JAVA_OPTS="-server -Xms2g -Xmx2g -Xmn1g -XX:MaxPermSize=384m -XX:PermSize=384m \

-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=85 -XX:MaxTenuringThreshold=32 \

 

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

 

 

-XX:+PrintClassHistogram -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC \

-XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC \

-verbose:gc -Xloggc:/usr/local/tomcat/logs/gc.log.$NOW \

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps \

-Dcom.sun.management.jmxremote \

-Dcom.sun.management.jmxremote.port=5400 \

-Dcom.sun.management.jmxremote.authenticate=false \

-Dcom.sun.management.jmxremote.ssl=false"

読んでおくべきページ

追記:GCログのローテーション

@n0tsさんから

と言われて最初はローテーションできないと思っていたんだけど、最近のJVMだと下記オプションでGCのログがローテートできるらしい。

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M

↑はローテーション数を10、1ファイルあたり10MBにする設定。Java 1.6.0_34、1.7.0_02以上から利用できるオプションらしい。ちなみにUbuntu 12.04のOpenJDK 1.7.0_15でもこのオプションは使えた。

上記を加えた秘伝のタレJVMオプションは下記になる。

JAVA_OPTS="-server -Xms2g -Xmx2g -Xmn1g -XX:MaxPermSize=384m -XX:PermSize=384m \
-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=85 -XX:MaxTenuringThreshold=32 \ 
-XX:+PrintClassHistogram -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC \ 
-XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC \
-verbose:gc -Xloggc:/usr/local/tomcat/logs/gc.log \
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M \
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=5400 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false"

結論

JVMはマイナーバージョンアップでもオプションが増えたりするので油断できない。

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング