10

Glassfishにアプリケーションをデプロイしています。時間の経過とともに、ロードされるクラスの数は数百万に達し、私のpermgenは上昇するようです。

トラブルシューティングを支援するために、jvm引数に以下を追加しました。-XX:+ PrintGCDetails -XX:+ TraceClassUnloading -XX:+ TraceClassLoading

出力を見ると、同じクラスが何度もロードされているのがわかります。基本的に、Webサービスが呼び出され、JAXBを使用してxmlを処理するたびに。

[JVM_DefineClassからcom.strikeiron.ZIPCodesInRadius $JaxbAccessorF_userIDをロードしました][JVM_DefineClassからcom.strikeiron.ZIPCodesInRadius$JaxbAccessorF_userIDをロードしました]

これはリークを示していますか?もしそうなら、どうすれば解決できますか?

4

2 に答える 2

9

私が抱えていたのと同じ問題を説明している同様のスレッドを見つけました。 http://forums.java.net/jive/thread.jspa?threadID=53362

https://github.com/javaee/jaxb-v2/issues/581でもバグを見つけました

基本的に、問題は、Beanが呼び出されるたびに新しいJAXBContext( "your.class.xsd")を実行していたことでした。バグによると、「JAXBContext.newInstance(...)を呼び出すと、現在または指定されたクラスローダーが(再)使用されるため、すべてをリロードする必要があります。」

解決策は、うまく機能するシングルトンを作成することでした。

public enum JAXBContextSingleton {

INSTANCE("your.class.xsd");
private JAXBContext context;

JAXBContextSingleton(String classToCreate) {
    try {
        this.context = JAXBContext.newInstance(classToCreate);
    } catch (JAXBException ex) {
        throw new IllegalStateException("Unbale to create JAXBContextSingleton");
    }
}

public JAXBContext getContext(){
    return context;
}

}

そしてシングルトンを使用するには

JAXBContext context = JAXBContextSingleton.INSTANCE.getContext();
于 2010-07-19T23:30:57.650 に答える
1

これが、私がJAXBから離れている理由の1つです。javax.xml.bind.Marshallerとを実装するクラスをマーシャルとアンマーシャルjavax.xml.bindUnmarshallerにそれぞれ作成したいと思います。一度書けば完成です。そのリフレクションと動的クラス生成はありません。

于 2010-07-15T22:44:47.543 に答える