なんか秘伝のタレみたいになってきたので後世のために共有。
前提
- 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 実践プログラミング
- 作者: Cay S. Horstmann,柴田芳樹
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
-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"
読んでおくべきページ
- Javaメモリ、GCチューニングとそれにまつわるトラブル対応手順まとめ - 日記のような何か - 各種オプションの意味が網羅的に書いてある。すごい。
- JavaVMで使用するメモリ空間の構成とJavaVMオプション - JVMのGCやメモリ空間についてわかりやすく説明されてる。Eden領域とかSurvivor領域ってなに?っていうのがわかる。
- コンカレントGCの注意点
追記: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 実践プログラミング
- 作者: Cay S. Horstmann,柴田芳樹
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る