[Seasar-user:5285] Re: S2TestCaseでOutOfMemoryErrorが発生する

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2006年 11月 27日 (月) 20:00:05 JST


小林 (koichik) です.

Date:    Mon, 27 Nov 2006 18:23:49 +0900
From:    "Nakata Kouji" <[E-MAIL ADDRESS DELETED]>
To:       [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:5282] Re: S2TestCaseでOutOfMemoryErrorが発生する

> TestCaseではなく、普通のJavaアプリケーションで再現させてみました。
> -Xmx2m にして、実行すると、321ループ目でOutOfMemoryが発生しました。
(略)
> このように aspect を付けるとどんどんメモリを食いつぶしていきます。

このようなコードを書くと簡単に OutOfMemoryError に
なります.

S2AOP では,アスペクトを適用する際に対象クラスの
サブクラスを動的に生成し,コンテキストクラス
ローダーにロードします.
添付していただいたサンプルや JUnit の TestCase を
直接継承したテストケースでは,コンテキストクラス
ローダーはシステムクラスローダーです.

クラスローダーに一度ロードされたクラスは,
クラスローダーが GC されない限りアンロード
されません.

そのため,S2Container の生成が行われるたびに
新たなクラスがシステムクラスローダーにロード
されますが,システムクラスローダーは決して
GC されないので,最後は OutOfMemoryError と
なります.

S2TestCase ではこのような事態を避けるため,テスト
メソッドごとに一時的なクラスローダーを作成して
コンテキストクラスローダーに設定します.
S2AOP によってエンハンスされたクラスはこの一時的な
クラスローダーにロードされます.

通常,一時的なクラスローダーはテストメソッドが
終了すると GC されるので,S2AOP が動的に作成した
クラスもアンロードされます.

S2AOP を利用した単体テストでは S2TestCase を
併用してください.


なお,Seasar2.3.10 以前では commons-logging の
キャッシュしている情報をクリアしていないため,
S2TestCase を利用してもメモリリークが発生します.
この問題は S2.3.11 で対応しています.
詳しくは以下を参照してください.

http://d.hatena.ne.jp/koichik/20060626#1151341237


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




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