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

BABA,Yasuyuki [E-MAIL ADDRESS DELETED]
2007年 8月 31日 (金) 04:03:05 JST


馬場と申します。

HotDeploy時のClassPoolのキャッシュについての報告です。

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

具体的には、クラスのpublicフィールドをJSPのELからアクセスするために、
PropertyInterTypeを適用しています。このときブラウザからのアクセスを繰り
返すと、OutOfMemoryErrorが発生する状況です。

プロファイラで確認したところ、ClassPoolが保持していると思われる、
Javassistでエンハンスされたクラス情報がGCで開放されずにヒープに大量に
残っているのが原因のようでした。
ClassPoolUtilではクラスローダをキーにClassPoolをclassPoolMapにキャッシュ
している箇所がありますが、HotDeploy時にはキーをHotDeployClassLoaderのイ
ンスタンスとして、対応するClassPoolが登録されています。これがリクエスト
終了後、GCでもエントリが破棄されず残ってしまうようです。そうすると、そこ
にあるエンハンスされたクラス情報(CtClassなど)がヒープを圧迫するようです。

確認のために、添付ファイルのように、コンテナ破棄時にHotDeployの場合はコ
ンテキストクラスローダに対応するエントリをキャッシュからremoveするように
してみたところ、とりあえずGCでエンハンスされたクラス情報が開放されるよう
になりました。(やり方が正しいかはちょっと自信がないのですが・・・)

環境は以下の通りです。
・s2-framework 2.4.17
・JDK 1.6.0_02
・Tomcat 5.5.23

よろしければ、このような修正を次回のリリースに含めていただけないでしょうか。

-- 
BABA,Yasuyuki
[E-MAIL ADDRESS DELETED]

-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: ClassPoolUtil.java
型:         text/x-java
サイズ:     6109 バイト
説明:       無し
URL:        http://ml.seasar.org/archives/seasar-user/attachments/20070831/f292a96d/attachment.bin 


Seasar-user メーリングリストの案内