[Seasar-user:10258] Re: HotDeploy時のClassPoolのキャッシュについて

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 9月 2日 (日) 04:00:35 JST


小林 (koichik) です.

Date:    Sun, 02 Sep 2007 02:37:36 +0900
From:    "BABA,Yasuyuki" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:10257] Re: HotDeploy時のClassPoolのキャッシュについて

> 先のコードに至った理由は、以下ようなコードで classPoolMap にキャッシュさ
> れる ClassPool を弱参照にすると、ヒープが増加していくことがなくなったた
> めです。

「なくなった」とはいっても,HotdeployClassLoader は
GC されないで残っているわけですよね?
そして HotdeloyClassLoader によってロードされている
クラスも残っているわけですよね?
であれば,抜本的な解決にはなっておらず,単なる「延命」が
できているに過ぎないのではないでしょうか.
つまり,Hotdeploy の繰り返し毎に

  HotdeployClassLoader のリソース + ClassPool のリソース

がリークしていたのが,

  HotdeployClassLoader のリソース

だけがリークしている状況になっただけではないでしょうか.

> なので、ClassPool が間接的に HotdeployClassLoader を参照しているため、
> WeakHashMap であっても GC の対象になっていないのかと思っていました。
> このあたりはちょっと詳しくないので、認識の間違いなどあれば教えていただけ
> ないでしょうか。

ClassPool というか,ClassPool に渡している
LoaderClassPath が HotdeployClassLoader への参照を
持ちますが,こちらは WeakReference が使われているので
GC を妨げることはないはずです.

Seasar2 には MemoryLeakTest というテストケースが
含まれています (org.seasar.framework.container.util
パッケージにあります).
このテストケースは HotdeployClassLoader ではありませんが,
テスト用のクラスローダを似たような形で利用しています.
全く同じではなく,UnitClassLoader 自身は通常のクラスを
直接ロードしないで親のクラスローダーに委譲してしまうため,
AOP を適用するクラスのみ直接ロードするようにするなど
修正して,ClassPool がテスト用クラスローダの弱参照を
持つようにしてテストしてみましたが,ClassPoolUtil の
キャッシュを保持したままでもテスト用クラスローダは
GC されて finalize() メソッドが呼び出されます.

ですから,問題は ClassPoolUtil や Javassist に
あるのではなく,HotdeployClassLoader がロードした
クラスやそのインスタンスへの参照が残っていることこそが
問題だと考えます.

> これは、JSPを表示するときにTomcatのJasperがエンハンスされたクラスを
> キャッシュしてしまうため、そこはcommons-elにパッチをあてています。
> 他にそういった部分がないかは引き続き検証していきたいと思います。

抜本的な対応はそれしかないと思うので頑張ってください.

> が、ちょっと行き詰まり気味なので、ポイントなど思いつくことがあれば教えて
> いただけたらうれしいです。

すでにご存じかもしれませんが,この辺とか.

http://opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669

それから,この手の問題は suga さんが詳しそう.
何か助言があればお願いします>suga さん


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