[seasar-javadoc:975] Re: UnitClassLoader
O.Goto
[E-MAIL ADDRESS DELETED]
2007年 7月 21日 (土) 20:49:17 JST
後藤(goto)です。
ペアやらせてもらいます。どうぞよろしくです。
ClassLoaderは難しいなぁ、と躊躇していたりしましたが何ごともチャレンジっていうことで。
On Fri, 20 Jul 2007 00:16:26 +0900
Hideaki Suzuki <[E-MAIL ADDRESS DELETED]> wrote:
> 鈴木(belltree)です。
>
> 小林さんの指摘を踏まえて修正してみました。いかかでやんしょ?
>
> * {@link org.seasar.extension.unit.S2TestCase S2TestCase} を使用した単体テスト等で使用する
> * {@link ClassLoader} です。
> *
> * アスペクトを適用したクラスを大量に使用するJUnitテストケース(またはスイート)を連続して実行する際に、
> * {@link OutOfMemoryError}の頻発を回避する目的で使用します。
> *
> * テストケースによっては、 アスペクトを適用したクラスが大量に生成される場合が考えられます。 クラスは通常、 VMのパーマネント領域にロードされますが、
> * 新たにクラスをロードする領域がなくなると、 {@link OutOfMemoryError} が発生します。 この問題を回避するために、
> * {@link org.seasar.extension.unit.S2TestCase S2TestCase} では、
> * テストケースの中で使用するクラス群を、 この{@link ClassLoader}でロードし、 テスト終了後{@link ClassLoader}ごと、
> * そのテストケースで使用したクラス群をアンロードするという方法を取っています。
>
まずは細かいところを突いてみると、
> * テストケースの中で使用するクラス群を、 この{@link ClassLoader}でロードし、 テスト終了後{@link ClassLoader}ごと、
ここの文脈で「{@link ClassLoader}」を使うと???って混乱してしまう人がいるかも、っていうか私がそうでした。私だけ?
一番最初の文で「{@link ClassLoader}」があるので十分かなと。なので、2つとも「@link 」を外して、
* テストケースの中で使用するクラス群を、 このクラスローダでロードし、 テスト終了後クラスローダごと、
の方がいいかなと思いました。
あと、クラスローダの親子関係にも触れた方がわかりやすい気がするので、
* {@link org.seasar.extension.unit.S2TestCase}では、 テストメソッド毎に{@link org.seasar.framework.container.S2Container S2コンテナ}を生成してアスペクトを適用したクラスをクラスローダにロードします。
* ここで、 テストメソッドが終了してもテストケースが終了していない場合、
* アスペクトを適用したクラスはクラスローダにロードされたまま次のテストメソッドを実行することになります。
* このままでは新たにクラスをロードする領域がなくなる恐れが発生するため、 実際の{@link org.seasar.extension.unit.S2TestCase}では、
* テストメソッド毎にカレントクラスローダを親とする<code>UnitClassLoader</code>を生成し、
* アスペクトを適用したクラスをこのクラスローダにロードさせます。 テストメソッド終了後はその<code>UnitClassLoader</code>自体をアンロードするため、アスペクトを適用したクラスも一緒にアンロードされることになります。
こんな記述をしてみました。でもこのままだと鈴木さんの書いた部分とかなりカブっているのでうまく折り合いをつけたいなと。
その前に誤った認識がないかチェックをお願いします。
seasar-javadoc メーリングリストの案内