本記事の情報は古いです。参考程度にとどめてください。
tomcat7で試した最新版はこちら
blog.tomorrow-japan.com
現象
TomcatにS2アプリケーションを配備して、とやってるとたまに、PermGen spaceを発生してTomcatが無反応になる。復旧はtomcat再起動しかない。回避
PermGen spaceを発生させない方法はなにかないか、と探す。(CATALINA_HOME)/bin/setenv.sh
を作る。
CentOSでは、startup.shと同ディレクトリに、setenv.shを配備しておくと、Bootstrapが読みこんでくれるんだとさ。
記述内容はgeek.confを参考に以下書いた。
expot CATALINA_OPTS="-server -verbose:gc -XX:+PrintGCTimeStamps -Xmx512M -Xms512M -Xss64M -XX:NewSize=256M -XX:MaxNewSize=512m -XX:SurvivorRatio=2 -XX:PermSize=128M -XX:MaxPermSize=512M -Xloggc:$CATALINA_HOME/logs/gc.`date '+%Y-%m-%d-%H%M%S'`.log"
- -Xss512Mでやるとtomcat起動しない。64ではOKだった。
- -XX:NewSize512MではToo small initial heap for new size specified。-XX:NewSize256Mで起動成功。
- 上記でtomcat起動したけど、apache経由で繋がらなくなったでござる。
- -Xms512Mが怪しい(でも、記述を消したり付けたりしてたらapache経由で確認できた。ふしぎ!)
- -XX:PermSize=128Mが怪しい(でも、記述を消したり付けたりしてたらapache経由で確認できた。ふしぎ!)
これでしばらく様子を見る。ひさしぶりにvi使ったなあ。
その後
2012/05/28追記上記設定で動かしてると、OutOfMemory頻発する。ちょいちょい弄って、以下で安定したかも。
expot CATALINA_OPTS="-server -verbose:gc -XX:+PrintGCTimeStamps -Xmx256M -Xms256M -Xss64M -XX:NewSize=1M -XX:MaxNewSize=16m -XX:SurvivorRatio=2 -XX:PermSize=128M -XX:MaxPermSize=128M -Xloggc:$CATALINA_HOME/logs/gc.`date '+%Y-%m-%d-%H%M%S'`.log"
2012/06/01追記
またまたOutOfMemory発生した。デプロイを頻繁にやった時に。もうちょいいじる。Xmsを縮小して、ヒープMAXに到達するまでの速度を(FullGCの頻度を)下げる狙い。うまくいくといいなー。
export CATALINA_OPTS="-server -verbose:gc -XX:+PrintGCTimeStamps -Xmx256M -Xms128M -Xss64M -XX:NewSize=1M -XX:MaxNewSize=16M -XX:SurvivorRatio=2 -XX:PermSize=128M -XX:MaxPermSize=128M -Xloggc:$CATALINA_HOME/logs/gc.`date '+%Y-%m-%d-%H%M%S'`.log"
2012/07/12追記一般にヒープサイズが小さいとGCが頻発してアプリケーションのパフォーマンスが低下します。
http://www.atmarkit.co.jp/fjava/rensai3/javavm02/javavm02_2.html
さらに、ヒープサイズが必要量を下回る場合はOutOfMemoryErrorが発生してアプリケーションが停止してしまいます。
一方、ヒープサイズが大きいと、GCの起動回数は減りますが、GC1回当たりの処理時間、すなわちアプリケーション停止状態が長くなり、アプリケーションの応答時間に問題が出る場合もあります。
システムの物理メモリのフリー領域が不足するまでヒープサイズを大きくすると、物理メモリからスワップ領域へのページングが起こってしまい、かなりのパフォーマンスが劣化する可能性もあります。
tomcat6。(CATALINA_HOME)/bin/setenv.sh
を配備したものの、tomcat起動後
# ps aux | grep Xms
を叩いてみると、反映されていない。/etc/tomcat6/tomcat6.confに直接、CATALINA_OPTSを書いたら反映された。