概要
JSF2.2で提供される機能のうち、@ViewScope
や@SessionScope
は非常に便利な機能です。
但し、残念なことにこの機能はメモリリークする問題が含まれているようです。
(@FlowScope
や@ConversionScope`でも発生しそうな感じですが、私は検証していません)
そのため、GlassFish4.0を起動し続けていると徐々にメモリが逼迫してしまい最終的にはOutOfMemoryでアプリケーションの応答しなくなります。
関連チケット
具体的なチケットとしては、JAVASERVERFACES-3194でJIRAにチケットが切られています。
Macadoshisさんが以下の様にコメントされていますが、まさに私も同様の現象が発生していました。
My jmeter tests simulating hundred of parallel users kill my available heap size very quickly
ただ、このチケットは色々迷走しているようで、closeされているのに2.2.7のリリースに含まれていなかったり、修正されていなくてReOpenされたりしています。最終的には6/25にfixされている状態です。
再現確認
このメモリリーク問題はJConsoleなどで簡単に確認する事が可能です。
(私はプロジェクト終盤の負荷テスト中に見つけましたがorz...)
memory-leakというシンプルなプロジェクトを作成して確認してみました。
このプロジェクトでは@ViewScope
でのメモリリークを調査しています。
- アプリを起動して再表示を何回かするとViewScopeで管理されているクラスが積み上がっていくことを確認。
- FullGCを実行しても解放されないことを確認
- 別画面へ遷移しても破棄されない事を確認
- FullGCを実行しても破棄されない事を確認
※Productクラスがいつメモリから解放されるかプロファイルしています
実は13:20:10辺りでFulGCをかけているのですが、全くメモリから解放されません。
また、別画面に遷移してみてもやはり解放されません。
そして解決?
rev13386で再修正したものがコミットされ、2.2.8でリリースされるようなので、最新をビルドして試してみようと思います。
おまけ
当初自分の実装の仕方や確認方法が悪いのでは..?と疑いました(今も疑っています)。
もし正しい実装方法があればご指摘いただきたいです。