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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 9月 8日 (土) 02:00:17 JST


小林 (koichik) です.

Date:    Fri, 07 Sep 2007 10:18:11 +0900
From:    "BABA,Yasuyuki" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:10383] Re: HotDeploy時のClassPoolのキャッシュについて

> プロファイラで見る限り、とくに残ってはいないようでした。
> WeakHashMap の値のほうは強参照なので、そのぶん GC で回収されるのが遅いと
> いうことはないでしょうか?

HotdeployClassLoader が GC されると WeakHashMap の
エントリが削除されて ClassPool への参照がなくなり,
それによって ClassPool も GC されるので,
HotdeployClassLoader より GC されるのが遅れる
可能性はあるでしょう.
しかし,これだけで

> ただ、ヒープ使用量が最大値近くにならないと GC が発生してもなかなか開放さ
> れず、早いタイミングで何度もリクエストが来た場合には、GC が間に合わずに
> OutOfMemoryError が発生しているようでした。

という現象になるほど遅れるとは思えません.

繰り返しになりますが,ClassPool が GC されるのは
HotdeployClassLoader が GC の対象になってからです.
ですから,もし ClassPool がなかなか GC されないなら
HotdeployClassLoader やそこにロードされたクラスへの
参照がどこかに残っている可能性が高いです.
そこを明らかにすべきだと思います.

もし HotdeployClassLoader が GC されて,つまり
ClassPoolUitl のキャッシュから ClassPool への
参照がなくなって,それでも ClassPool がなかなか
GC されないのであればまた話が違いますが,

> DisposableUtil を使うパターンだと、同じ条件なら OutOfMemoryError は発生
> しませんでした。

ということから,それは該当しないはずです.
やっぱり HotdeployClassLoader またはそこに
ロードされたクラスへの参照が残っているのが
根本的な原因と考えるのが妥当だと思います.


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