お客様が運用しているアプリケーションサーバ(Tomcat)で、ときどきメモリ不足で応答しなくなる問題が発生していた。この問題の調査を行い、対策を提示した。主な経緯:
運用しているプログラムを貸与していただき、ダミーのテスト用サーバを立てた。
自動テストプログラムで負荷をかけたりしたが、状況は発生しなかった。
お客様にお願いし、問題が発生したときにサーバを再起動させる前にスレッドダンプを取得していただいた。
スレッドダンプを読むと、明らかに無限に再帰呼び出しを起こしていると思われる状態で、該当箇所はTomcat本体のプログラムであった。
同じバージョンのTomcatのソースコードを入手し、該当箇所を調べたところ、ある条件で必ず無限再帰呼び出しが発生するようなコードとなっていた。
その次のバージョンのソースコードも調べると、その箇所は修正されていたため、Tomcatのバグと断定。
かといって、サーバのバージョンアップはリスクを伴うため、その箇所が呼ばれないような設定をしていただくことで対策とした。