[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 メーリングリストの案内