2010-07-15 4 views
7

Ich habe eine Anwendung auf Glassfish bereitgestellt. Im Laufe der Zeit steigt die Anzahl der geladenen Klassen in die Millionen und mein Permgen scheint zu steigen.Habe ich ein JAXB Classloader-Leck

Um bei der Fehlersuche zu helfen, habe ich zu meinen jvm-Argumenten folgendes hinzugefügt. -XX: + PrintGCDetails -XX: + TraceClassUnloading -XX: + TraceClassLoading

Nun, wenn die Ausgabe beobachten, sehe ich die gleichen Klassen über, die geladen und immer wieder. Grundsätzlich jedes Mal, wenn ein Web-Service aufgerufen wird und JAXB zur Verarbeitung der XML-Datei verwendet wird.

[Loaded com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID von JVM_DefineClass] [Loaded com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID von JVM_DefineClass]

dies auf ein Leck hindeuten Hat? Wenn ja, wie kann ich es lösen?

Antwort

6

Ich fand einen ähnlichen Thread, der das gleiche Problem beschrieb, das ich hatte. http://forums.java.net/jive/thread.jspa?threadID=53362

fand ich auch einen Fehler bei https://java.net/jira/browse/JAXB-581

Grundsätzlich ist das Problem war, dass ich jedes Mal meine Bohne wurde aufgerufen, um einen neuen JAXBContext („your.class.xsd“) tat. Laut dem Bug "Aufruf von JAXBContext.newInstance (...) impliziert das Neuladen von allem, da entweder der aktuelle oder der spezifizierte Klassenlader (wieder) benutzt werden soll."

Die Lösung war, ein Singleton zu schaffen, das großartig funktionierte.

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; 
} 

} 

Und die Singleton verwenden

JAXBContext context = JAXBContextSingleton.INSTANCE.getContext(); 
0

Dies ist einer der Gründe, warum ich von JAXB fern bleibe. Ich würde lieber Klassen zu Marshal und Unmarshal schreiben, die javax.xml.bind.Marshaller bzw. javax.xml.bindUnmarshaller implementieren. Ich schreibe sie einmal und sie sind fertig. Keine dieser Reflektions- und dynamischen Klassengenerierung.