2010-08-27 7 views
13

Dopo una recente distribuzione nel test di sistema, uno dei nostri servlet è stato colpito molto più del solito e abbiamo notato che la memoria iniziava a salire e weblogic alla fine sarebbe morto. Il mio stagista, ero molto orgoglioso, ha scoperto la fonte della perdita di memoria.JAXBContext.new Perdita di memoria nell'istanza

Ogni volta che arriva una richiesta, questa linea viene chiamato:

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

Per qualche ragione, l'oggetto non viene mai garbage collection. Una volta che l'abbiamo reso statico e spostato dove l'abbiamo inizializzato, la nostra perdita di memoria è scomparsa.

Un altro dei nostri sviluppatori ha inserito solo quella linea in un ciclo while in un'applicazione java autonoma e ha visto anche lo scorrimento della memoria verso l'alto e verso l'alto.

Qualcuno ha qualche idea del perché quell'oggetto non recuperi i rifiuti?

Grazie

risposta

8

Quale implementazione & versione di JAXB stai usando? Se stai usando l'implementazione di riferimento fornita con Java SE 6, allora è Metro (https://jaxb.dev.java.net/).

Ecco alcuni dei bug correlati là di memoria:

Se vi capita di essere utilizzando l'attuazione Moxy (http://www.eclipse.org/eclipselink/moxy.php) allora posso aiutare il debug.

La buona notizia è che JAXBContext è thread-safe e deve essere creato una sola volta e riutilizzato. Riutilizzare il JAXBContext sembra anche risolvere la perdita di memoria.

Per ulteriori informazioni si veda:

+2

collegamento aggiornato: http://jaxb.java.net/guide/Performance_and_thread_safety.html –

+0

@ThangPham - Grazie, ho aggiornato la mia risposta con il nuovo collegamento che avete fornito. –

+0

Anche questo è un problema noto con il rilascio di JAXB per Java 7? La soluzione che hai dato rimarrebbe valida, ma sarebbe bene sapere se questo è ancora qualcosa da guardare attivamente. –

1

Sì, è una perdita. Caricherà la classe "ruby.oracle_servlet.schemas", ogni volta che viene chiamato questo metodo.

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