Spring2.5.6を使ってるWebアプリケーション on Tomcatが1ヶ月くらい再起動しないで稼動し続けてたら、FullGCが発生してもOld領域があまり減らずメモリを圧迫し続けるという現象が発生したので調査。
メモリマップを取ってみて調査してみると大量のRedirectViewオブジェクトが格納されているMapを発見。
Spring2.5.6のソースを覗いてみたところ、
UrlBasedViewResolverが"redirect:"と"forward:"プレフィックスのURLをキー※として
MapでRedirectViewオブジェクトをキャッシュしていて
このMapオブジェクトをDispatcherServletが参照しているため
GC対象になっていないっぽい。
しかもキャッシュの上限はないという鬼仕様っぽい
(ちなみにSpring3系では上限指定できるようになっていますよと教えてもらった)
※ 動的にURLを生成してredirectとかしてたら、上限無くメモリが上がり続けてました・・・
とりあえずキャッシュを無効してみる。
viewResolverには
org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver
を使用していて
<property name="cache" value="false" />
に設定
ただ、ソースを見る限り、通常のftl用のキャッシュも無効になってしまう模様。
(負荷が上がってしまう懸念があったが、実際にはそんなに変わらなかった。サーバのスペックが良かったからか?)
そして処理が呼ばれる度(つまり毎アクセスの度に)WARNメッセージを出すという・・・。
なのでlog4jに
<!-- org.springframework.web.servlet.view -->
<category name="org.springframework.web.servlet.view" additivity="false">
<level value="ERROR" />
<appender-ref ref="hoge" />
</category>
を追記して出ないようにした。
(このパッケージ以下のWARNでなくなっちゃうけど致し方なしということで・・・)
これで、このキャッシュに関しては解決しました。
メモリマップを取ってみて調査してみると大量のRedirectViewオブジェクトが格納されているMapを発見。
Spring2.5.6のソースを覗いてみたところ、
UrlBasedViewResolverが"redirect:"と"forward:"プレフィックスのURLをキー※として
MapでRedirectViewオブジェクトをキャッシュしていて
このMapオブジェクトをDispatcherServletが参照しているため
GC対象になっていないっぽい。
しかもキャッシュの上限はないという鬼仕様っぽい
(ちなみにSpring3系では上限指定できるようになっていますよと教えてもらった)
※ 動的にURLを生成してredirectとかしてたら、上限無くメモリが上がり続けてました・・・
とりあえずキャッシュを無効してみる。
viewResolverには
org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver
を使用していて
<property name="cache" value="false" />
に設定
ただ、ソースを見る限り、通常のftl用のキャッシュも無効になってしまう模様。
(負荷が上がってしまう懸念があったが、実際にはそんなに変わらなかった。サーバのスペックが良かったからか?)
そして処理が呼ばれる度(つまり毎アクセスの度に)WARNメッセージを出すという・・・。
なのでlog4jに
<!-- org.springframework.web.servlet.view -->
<category name="org.springframework.web.servlet.view" additivity="false">
<level value="ERROR" />
<appender-ref ref="hoge" />
</category>
を追記して出ないようにした。
(このパッケージ以下のWARNでなくなっちゃうけど致し方なしということで・・・)
これで、このキャッシュに関しては解決しました。