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

BABA,Yasuyuki [E-MAIL ADDRESS DELETED]
2007年 9月 2日 (日) 02:37:36 JST


馬場です。
すみません、素早いお返事をいただいているのに返信が遅くなってしまいました。

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

先のコードに至った理由は、以下ようなコードで classPoolMap にキャッシュさ
れる ClassPool を弱参照にすると、ヒープが増加していくことがなくなったた
めです。
    public static ClassPool getClassPool(final ClassLoader classLoader) {
//        ClassPool classPool = (ClassPool) classPoolMap.get(classLoader);
        ClassPool classPool = null;
        Reference reference = (Reference) classPoolMap.get(classLoader);
        if (reference != null) {
            classPool = (ClassPool) reference.get();
        }
        if (classPool == null) {
            if (classLoader == null) {
                return ClassPool.getDefault();
            }
            classPool = new ClassPool();
            classPool.appendClassPath(new LoaderClassPath(classLoader));
//            classPoolMap.put(classLoader, classPool);
            classPoolMap.put(classLoader, new WeakReference(classPool));
        }
        return classPool;
    }
なので、ClassPool が間接的に HotdeployClassLoader を参照しているため、
WeakHashMap であっても GC の対象になっていないのかと思っていました。
このあたりはちょっと詳しくないので、認識の間違いなどあれば教えていただけ
ないでしょうか。


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

これは、JSPを表示するときにTomcatのJasperがエンハンスされたクラスを
キャッシュしてしまうため、そこはcommons-elにパッチをあてています。
他にそういった部分がないかは引き続き検証していきたいと思います。

が、ちょっと行き詰まり気味なので、ポイントなど思いつくことがあれば教えて
いただけたらうれしいです。


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

--------------------------------------
Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar
http://pr.mail.yahoo.co.jp/toolbar/




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