Tomcat 終了時に致命的エラー

 

struts2.1.16 のWebアプリにて tomcat 6.0.24, 6.0.26 に上げると、tomcat終了時に org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap がエラーを吐くケースがありました。

致命的: A web application created a ThreadLocal with key of type [null] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@255deef]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@12536af]) but failed to remove it when the web application was stopped. To prevent a memory leak, the ThreadLocal has been forcibly removed.

tomcat のソースを調べてみるとjava.lang.ThreadLocal$ThreadLocalMapの中身を無理やり探索し、解放されていないデータがあるとエラーを吐いた上で解放するようになっていました。(実際は条件がもうちょっと複雑だけど)
解放されていないデータは、com.opensymphony.xwork2.inject.ContainerImpl クラスのprotected なスレッドローカル localContext の値。

エラーログが出て気持ち悪いけど、とりあえずメモリは解放されているようなので、問題にはならなそう。struts2の修正を待つとしますか。。。

といっても 携帯サイトに Struts 2.1.8 を適用したら文字が見えない!で書いたようにstruts2のバージョンを上げられないのでstruts2の修正が出ても適用できないかも。。。困ったものです。

余談ですが、com.opensymphony.xwork2.inject.* のソースのCopyright は

Copyright (C) 2006 Google Inc.

になってました。OpenSymphonyじゃないのですね。ちょっと発見。