メモリリークは起こるもの。
しかし、長期休暇の最中などに「サイトが落ちた」の連絡を受けるのは御免を蒙りたいので、方法を調べました。
1:OutOfMemoryError発生時に自動で実行したいバッチファイルを用意する。
例:
↓のようなファイルrestartTomcat.shを作り、適当な場所(/usr/local/tomcat/binなど)に配置します。
※「chmod +x restartTomcat.sh」などで、実行権限を付けておきます。
#!/bin/bash
#tomcat再起動(例)再起動以外に実行したいコマンドがあるなら一緒に書きます。メール飛ばすとか。
systemctl restart tomcat.service
2:TomcatのjvmオプションにXX:OnOutOfMemoryErrorを追記する。
環境変数CATALINA_OPTSに以下のオプションを追加して、OutOfMemoryError時に実行するコマンドを指定します。
- -XX:OnOutOfMemoryError
Tomcatのjvmオプションを指定する一つの方法としては、
/usr/local/tomcat/binに「setenv.sh」というファイルを置けば、Tomcat起動時にcatalina.shから読み込まれます。
例:
export CATALINA_OPTS="$CATALINA_OPTS -XX:OnOutOfMemoryError=\"/usr/local/tomcat/bin/restartTomcat.sh\""
これで、OutOfMemoryError時にrestartTomcat.shを実行してくれます。
3:HeapDumpも一緒に出力する。
HeapDumpも出したい場合は、環境変数CATALINA_OPTSに以下の2つのオプションを追加します。
- -XX:+HeapDumpOnOutOfMemoryError(OutOfMemoryError時に、HeapDumpを出力します。)
- -XX:HeapDumpPath(上記のHeapDumpの出力先を指定します。)
例:
export CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError"
export CATALINA_OPTS="$CATALINA_OPTS -XX:HeapDumpPath=/usr/local/tomcat/logs"
export CATALINA_OPTS="$CATALINA_OPTS -XX:OnOutOfMemoryError=\"/usr/local/tomcat/bin/restartTomcat.sh\""
※ただ、Tomcatが再起動するより前にHeapDumpが完了しているかが不透明なため、
HeapDumpを確実に出力したいならば、HeapDumpOnOutOfMemoryErrorの代わりに、restartTomcat.shの中からダンプさせるなどして、ダンプの出力前にTomcatが再起動しないようにするべきかも・・・