Tomcat が終了しない原因の調査 - 前編

shutdown.sh を実行しても Tomcat がきちんと終了せずプロセスが残ってしまうことがたまにあります。原因を探っています。

前提知識として JVM はデーモンスレッド以外のスレッドが全て終了した時に終了します。(詳しくは java.lang.Thread の API リファレンスを参照してください: https://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Thread.html )

終了しないことが多い Tomcat のスレッドダンプを取ってみるとデーモンスレッドではないスレッドがありました。

"RMI Reaper" prio=1 tid=0x0821b0c0 nid=0x67b4 in Object.wait() [0xadf84000..0xadf84e20]
at java.lang.Object.wait(Native Method)
- waiting on <0x8a8d8e30> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x8a8d8e30> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at sun.rmi.transport.ObjectTable$Reaper.run(ObjectTable.java:336)
at java.lang.Thread.run(Thread.java:595)


※ デーモンスレッドの場合は 1 行目のダブルクォーテーションで囲まれたスレッド名の後ろに daemon と表示されます。(VM のバージョン、ベンダにより異なる可能性があります。今回は Sun Java 1.5.0_13 を利用しました。)

これが原因のようです。"RMI Reaper" で web 検索してみるといろいろ事例がありますね。要は RMI を利用するアプリケーションが正しく終了処理をしていないのが原因です。

今回はここまで。次回は弊社の場合の "正しく終了処理をしていない" アプリケーションの調査とその回避方法を探ります。

  • Andy