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