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

·3 分で読めます

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

前提

  • 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さんから

@oinume 素適な情報ありがとうございます!この設定だと、毎日ログが自動的にローテションされますかね?試した感じだと、tomcatが起動した日付のファイルにしか出力されないよう気がするんですが。

— Naoya Nakazawaさん (@n0ts) 2013年3月23日

と言われて最初はローテーションできないと思っていたんだけど、最近の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 実践プログラミング