Tomcatのメモリリーク?

開発環境でTomcatアプリケーションの性能を測定し、OSでのメモリ使用率を取得しグラフ化したところ、緩やかにメモリ使用率が右肩上がりに上昇し続け、まるでメモリリークが発生しているかのようにみえる事象に出くわしました。さらにpsコマンドを同時に実行し続けた結果をみると、tomcatのプロセスのメモリ使用率が緩やかに上昇し続けています。

結論からいうと、tomcatユーザの.bash_profileで上書きしたCATALINA_OPTSの設定値が以下のような通常では考えられない巨大な値に設定されていた事が原因でした。

CATALINA_OPTS="-Xmx4096m -Xms2048m -Xss2048m"
export CATALINA_OPTS

字面だけみると自分でも「何だそれ。。」という感じなのですが、JVMGCに関する理解が甘かったために特定に至るまでに時間を要してしまいました。

なぜこのような値に設定されているか経緯を調べたところ(当時参画していなかったため)、開発時にOutOfMemoryが発生してしまったので場当たり的にヒープメモリサイズを十二分に大きい値に設定したとの事でした(現在もその値のままだった)。当時、複数のユーザ(開発者)でtomcatを共有してシミュレータなども含めて20以上のJavaアプリを動かしていたとのこと。

そのような環境を単独のtomcatアプリだけで使用すると、長時間高付加で連続実行しても全体から見れば発生したJavaオブジェクトは少量であるため、長期間GC対象にならずにヒープメモリに蓄積され続け、それがリークしているようにみえていたようです。