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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 8月 31日 (金) 05:30:09 JST


小林 (koichik) です.

Date:    Fri, 31 Aug 2007 04:03:05 +0900
From:    "BABA,Yasuyuki" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:10237] HotDeploy時のClassPoolのキャッシュについて

> 詳しくは調べきれていないのですが、HotDeploy時にAOPでエンハンスされたクラ
> スを使用すると、GCが走ってもClassPoolUtilで保持しているClassPoolのキャッ
> シュが開放されずにヒープを食いつぶす場合があるようです。

ClassPoolUtil は WeakHashMap を使っているので,
HotdeployClassLoader が GC の対象になれば
ClassPool への参照もなくなるはずです.

> ClassPoolUtilではクラスローダをキーにClassPoolをclassPoolMapにキャッシュ
> している箇所がありますが、HotDeploy時にはキーをHotDeployClassLoaderのイ
> ンスタンスとして、対応するClassPoolが登録されています。これがリクエスト
> 終了後、GCでもエントリが破棄されず残ってしまうようです。

HotdeployClassLoader が GC されないことが
根本的な問題だと思います.

おそらく HotdeployClassLoader 以外のクラス
ローダでロードされたクラスから,
HotdeployClassLoader でロードされたクラスへの
参照が残っているのだと思います.

そこをクリアしないと,修正版の ClassPoolUtil を
使っていても,エンハンスされたクラス
(CtClass ではなく $$EnhancedByS2AOP なクラス) が
溜まっていき,いずれパーマネント領域が不足して
OutoOfMemoryError になると思います.

多少延命できても根本的な解決にはならず,
問題に気づきにくくなるだけのように思うので,
提供していただいた修正を取り込むのはあまり
気が進みません.

どうしても HotdeployClassLoader を
GC させることができなくて,延命するしか
手がないということであれば検討しますが,
まずは HotdeployClassLoader が GC されない
原因を調査してみてください.


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