LoginSignup
15
18

More than 5 years have passed since last update.

TomcatがOutOfMemoryErrorを起こした時に自動的に再起動するように設定する

Last updated at Posted at 2017-09-26

メモリリークは起こるもの。
しかし、長期休暇の最中などに「サイトが落ちた」の連絡を受けるのは御免を蒙りたいので、方法を調べました。

1:OutOfMemoryError発生時に自動で実行したいバッチファイルを用意する。

例:
↓のようなファイルrestartTomcat.shを作り、適当な場所(/usr/local/tomcat/binなど)に配置します。
※「chmod +x restartTomcat.sh」などで、実行権限を付けておきます。

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から読み込まれます。

例:

setenv.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の出力先を指定します。)

例:

setenv.sh

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が再起動しないようにするべきかも・・・

15
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
18