2010-08-27 26 views
13

Después de una implementación reciente en la prueba del sistema, uno de nuestros servlets era golpeado mucho más fuerte de lo habitual y notamos que la memoria comenzaba a subir y weblogic finalmente moriría. Mi pasante, estaba muy orgulloso, descubrí la fuente de la pérdida de memoria.JAXBContext.newInstance memory leak

Siempre que llega una petición, esta línea se llama a:

JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”); 

Por alguna razón, el objeto nunca se vuelve basura recogida. Una vez que lo hicimos estático y lo movimos donde lo inicializamos, nuestra pérdida de memoria desapareció.

Otro de nuestros desarrolladores puso simplemente esa línea en un ciclo while en la aplicación java independiente y también vio subir y bajar la memoria.

¿Alguien tiene alguna idea de por qué ese objeto no se recoge basura?

Gracias

Respuesta

8

Qué aplicación & versión de JAXB está usando? Si está utilizando la implementación de referencia que viene con Java SE 6, entonces es Metro (https://jaxb.dev.java.net/).

Éstos son algunos de los errores relacionados con la memoria allí:

Si se esté utilizando la aplicación moxy (http://www.eclipse.org/eclipselink/moxy.php) entonces puedo ayudar a depurar.

La buena noticia es que JAXBContext es seguro para subprocesos y solo debe crearse una vez y reutilizarse. La reutilización del JAXBContext también parece resolver la fuga de memoria.

Para más información ver:

+2

Enlace actualización: http://jaxb.java.net/guide/Performance_and_thread_safety.html –

+0

@ThangPham - Gracias, He actualizado mi respuesta con el nuevo enlace que ha proporcionado. –

+0

¿Es esto también un problema conocido con el lanzamiento de JAXB para Java 7? La solución que dio aún se mantendría, pero sería bueno saber si esto es algo que hay que vigilar activamente. –

1

sí, es una fuga. Cargará la clase "ruby.oracle_servlet.schemas", cada vez que se llame a este método.

JAXBContext.newInstance(“ruby.oracle_servlet.schemas”)