デフォルトだと -Xmx128m

この間この Blog システムを Tomcat (Spring Boot) 上で動作するように修正したのだが、それからどうも動作が緩慢になったように思っていた。 確かに Load Average を見ても高めの値を示している。 そして、画像をアップロードしたら OutOfMemoryError: Java heap space. でクラッシュした。 これはまずいと調査を開始した。

Tomcat のヒープサイズは Ubuntu Server のデフォルトの状態だと -Xmx128m (最大ヒープサイズ 128 M) になっている。 これは Tomcat 起動時に catalina.out にログ出力されているので確認する:

view /var/log/tomcat8/catalina.out

" CATALINA_BASE, CATALINA_HOME もログ出力されているので確認しておく
CATALINA_BASE:         /var/lib/tomcat8
CATALINA_HOME:         /usr/share/tomcat8
...(略)...
Command line argument: -Xmx128m

setenv.sh

Tomcat のヒープサイズを変更するために Tomcat 起動時に環境変数を渡すにはどうしたら良いのか調べてみたが setenv.sh を定義するのがいいらしい。 Ubuntu のデフォルトではこのファイルは存在しないので $CATALINA_HOME/bin 若しくは $CATALINA_BASE/bin に作成する必要がある。 Tomcat を起動するためにキックされる catalina.sh に以下のように書かれている:

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi

そこで $CATALINA_HOME/bin/setenv.sh に以下のように作成する:

export CATALINA_OPTS='-Xms256m -Xmx512m -Xss1024k -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled'

変更を適用するために Tomcat を再起動する:

sudo service tomcat8 restart

catalina.out を確認すると正しくこの値が使用されているのがわかる:

情報: Command line argument: -Xms256m
情報: Command line argument: -Xmx512m

また ps aux | grep tomcat8 のようにプロセスを検索しても良い。