[Seasar-user:1702] Re: OutOfMemoryError が発生してしまいます。

Koichi Kobayashi koichik
2005年 3月 30日 (水) 01:09:49 JST


小林 (koichik) です.

On Tue, 29 Mar 2005 10:45:59 +0900 (JST)
佐藤 崇 <[E-MAIL ADDRESS DELETED]> wrote:

> ただ、フィルタからchain.doFilter()で呼び出した先で、処理
> ごとにコンテナを以下のようにインスタンス化し、
> S2Container container =
> S2ContainerFactory.create(PATH_addr);
> container.init();
> 処理の最後でcontainer.destroy()を呼び出しています。
> 
> つまり、
> > リクエストが来るたびに S2
> > コンテナをインスタンス化したりは
> > していないでしょうか?
> ということなのでしょうか?

ですね.

> もしかしてなのですが、コンテナはアプリケーション起動
> 時に一度だけインスタンス化し(アプリケーションで使用する
> 全てのクラスをコンテナに入れて?)、リクエスト毎にコンテ
> ナから必要なクラスだけを取り出して使用するといった使い方
> が正しいのですか?

はい.
コンテナの初期化は重い処理ですし,AOP を使うと動的に
クラスを生成するのですが,それはコンテナを destroy() しても
クラスローダーからアンロードされません (Java の仕様です).
そのため,クラスローダーがこれ以上クラスをロードできない
状態となってしまい,OutOfMemoryError になったものと思われます.

フィルタの init() でコンテナを初期化して, doFilter() では
生成済みのコンテナを使うだけにしてください.その際には,
org.seasar.framework.container.factory.SingletonS2ContainerFactory
を使うとよいと思います.使い方は
org.seasar.framework.container.servlet.S2ContainerServlet
を参考にしてください.
といいますか,可能ならお使いのサーブレットに加えて S2ContainerServlet も
web.xml に記述して,コンテナの初期化はお任せにした方がよいかと思います.


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内