2010-07-15 10 views
7

Ho un'applicazione distribuita su Glassfish. Nel corso del tempo il numero di classi caricate sale a milioni e il mio permgen sembra aumentare.Ho una perdita di classloader JAXB

Per facilitare la risoluzione dei problemi, ho aggiunto quanto segue ai miei argomenti di jvm. -XX: + PrintGCDetails -XX: + TraceClassUnloading -XX: + TraceClassLoading

Ora, quando si guarda l'uscita, vedo le stesse classi corso di caricamento più e più volte. Fondamentalmente ogni volta che viene chiamato un servizio web e JAXB viene utilizzato per elaborare l'xml.

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

Questo indica una perdita? Se sì, come posso risolverlo?

risposta

6

Ho trovato un thread simile che stava descrivendo lo stesso problema che stavo avendo. http://forums.java.net/jive/thread.jspa?threadID=53362

Ho anche trovato un bug in https://java.net/jira/browse/JAXB-581

In sostanza, il problema era che stavo facendo un nuovo JAXBContext ("your.class.xsd") ogni volta che il mio chicco è stato invocato. Secondo l'errore "Calling JAXBContext.newInstance (...) implica il ricaricamento di tutto, dal momento che il loader della classe corrente o quello specificato deve essere (riutilizzato)".

La soluzione era creare un singleton che funzionasse alla grande.

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

} 

E per utilizzare il Singleton

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

Questo è uno dei motivi per cui sto lontano da JAXB. Preferirei scrivere classi di marshall e unmarshal che implementano rispettivamente javax.xml.bind.Marshaller e javax.xml.bindUnmarshaller. Li scrivo una volta e hanno finito. Nessuno di quella riflessione e generazione di classi dinamiche.

Problemi correlati