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