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じゃないのですね。ちょっと発見。


