2010-08-27 25 views
13

Après un déploiement récent dans le test du système, l'une de nos servlets était plus durement touchée que d'habitude et nous avons remarqué que la mémoire commençait à grimper et weblogic finissait par mourir. Mon stagiaire, j'étais très fier, a découvert la source de la fuite de mémoire.JAXBContext.newInstance fuite de mémoire

Chaque fois qu'une requête arrive, cette ligne est appelée:

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

Pour une raison quelconque, l'objet devient déchets collectés jamais. Une fois que nous l'avons rendu statique et déplacé là où nous l'avons initialisé, notre fuite de mémoire est partie.

Un autre de nos développeurs a mis juste cette ligne dans une boucle while dans l'application java autonome et a également vu la mémoire glisser vers le haut et vers le haut.

Est-ce que quelqu'un a des idées pour lesquelles cet objet n'est pas collecté?

Merci

Répondre

8

Quelle mise en œuvre & version du JAXB utilisez-vous? Si vous utilisez l'implémentation de référence fournie avec Java SE 6, il s'agit de Metro (https://jaxb.dev.java.net/).

Voici quelques-uns là-bas des bugs liés à la mémoire:

Si vous arrive d'utiliser la mise en œuvre Moxy (http://www.eclipse.org/eclipselink/moxy.php) alors je peux aider à déboguer. La bonne nouvelle est que JAXBContext est thread-safe et ne devrait être créé qu'une seule fois et réutilisé. Réutiliser le JAXBContext semble également résoudre votre fuite de mémoire.

Pour plus d'informations, voir:

+2

Lien mis à jour: http://jaxb.java.net/guide/Performance_and_thread_safety.html –

+0

@ThangPham - Merci, je l'ai mis à jour ma réponse avec le nouveau lien que vous avez fourni. –

+0

Est-ce aussi un problème connu avec la sortie de JAXB for Java 7? La solution que vous avez donnée serait toujours valable, mais il serait bon de savoir si c'est encore quelque chose à surveiller activement. –

1

Oui, il y a une fuite. Il chargera la classe "ruby.oracle_servlet.schemas", chaque fois que cette méthode est appelée.

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