2010-07-15 10 views
7

Tengo una aplicación implementada en Glassfish. Con el tiempo, la cantidad de clases cargadas asciende a millones y mi permgen parece aumentar.Tengo una fuga del cargador de clase JAXB

Para ayudar a solucionar los problemas Agregué lo siguiente a mis argumentos de jvm. -XX: + PrintGCDetails -XX: + TraceClassUnloading -XX: + TraceClassLoading

Ahora al ver la salida, veo las mismas clases que se carga una y otra vez. Básicamente cada vez que se llama un servicio web y JAXB se utiliza para procesar el xml.

[Cargado com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID de JVM_DefineClass] [Cargado com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID de JVM_DefineClass]

¿Indica esto una fuga? Si es así, ¿cómo lo resuelvo?

Respuesta

6

Encontré un hilo similar que describía el mismo problema que estaba teniendo. http://forums.java.net/jive/thread.jspa?threadID=53362

También encontré un error en https://java.net/jira/browse/JAXB-581

Básicamente, el problema era que yo estaba haciendo un nuevo JAXBContext ("your.class.xsd") cada vez que se invoca mi frijol. De acuerdo con el error "Llamar a JAXBContext.newInstance (...) implica recargar todo, ya sea que el cargador de clases actual o el especificado sea (re) utilizado".

La solución fue crear un singleton que funcionó muy bien.

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

} 

Y para usar el singleton

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

Esta es una de las razones por las que me mantengo alejado de JAXB. Prefiero escribir clases para ordenar y desempatar que implementan javax.xml.bind.Marshaller y javax.xml.bindUnmarshaller, respectivamente. Los escribo una vez y terminan. Nada de esa reflexión y generación dinámica de clases.

Cuestiones relacionadas