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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2006年 11月 23日 (木) 00:00:18 JST


小林 (koichik) です.

Date:    Wed, 22 Nov 2006 22:37:38 +0900
From:    "Nakata Kouji" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:5252] Re: S2TestCaseでOutOfMemoryErrorが発生する

> 今日いろいろいじっていたら再現しなくなってしまいました。

(^^;

> MAX2MBで始めて、メモリを食いつぶしてはいくのですが、残り64KBぐらいのまま、
> すべてのメソッドを実行できました。ただ、このfreeMemoryがじわじわと減っていく
> というのも私の環境だけの現象なのでしょうか?

今時の GC は複雑なので何とも言えませんが,一定のところで
使用しているメモリ量が止まるならメモリリークしているわけでは
ないと考えていいのではないかと思います.

> ただ、実際のテストケースでは相変わらずOutOfMemoryErrorが発生しているので、
> また最小ケースを探してみます。

注意点としては,テストケースごとに作成されるクラスローダーに
ロードされないクラス (システムクラスローダーにロードされる
クラス) から,S2 がインスタンス化したオブジェクトへの
参照があると,テストケースごとに作成されるクラスローダーや
それによってロードされたクラス,S2 コンテナのインスタンス等が
GC されなくなります.

システムクラスローダーにロードされるクラスの典型は
テストクラス自身です.
テストクラスの フィールドに S2 コンテナから取得した
コンポーネント等を保持したりすると GC されないオブジェクトや
アンロードされないクラスが大量に残るかもしれません.

S2TestCase が DI したフィールドはテストメソッド実行時に
null でクリアしていますが,テストクラス自身が設定した
フィールドはクリアしていないので,テストクラス自身で
参照を切る必要があります.

たしかテストクラスのインスタンスはテストが終わると GC
されていたような気がするので (記憶が曖昧ですが),問題に
なりやすいのはテストクラスの static フィールドですね.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>




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