2010-05-26 5 views
2

Je reçois erreur de dépassement de mémoire:Fuite de mémoire avec JAXB

 
Memory Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at org.apache.xerces.dom.CoreDocumentImpl.createElement(CoreDocumentImpl.java:564) 

J'ai un programme Java autonome qui va chercher les données de base de données et créer un fichier XML à l'aide DOM. Je reçois l'erreur ci-dessus si les données récupérées sont énormes, dans mon cas, il est> 1 000 000 enregistrements.

J'ai défini 2 Go comme taille de tas tout en appelant la classe Java à partir d'unix.

Je l'ai essayé avec JAXB, mais je n'ai toujours pas d'amélioration significative.

Toutes les suggestions pour améliorer le code.

+1

Pourquoi pensez-vous qu'il y a une fuite de mémoire? Si vous utilisez DOM, vous chargez tout le document en mémoire à la fois. Si le document est énorme, votre programme utilisera une énorme quantité de mémoire et vous pourriez obtenir un 'OutOfMemoryError'. Cette erreur ne signifie pas automatiquement qu'il y a une fuite de mémoire. – Jesper

Répondre

6

Vous devriez probablement éviter de charger le fichier entier en mémoire à la fois. Pour ce faire, passez de DOM à une autre technologie telle que SAX ou StAX. Il s'agit d'une API de streaming et sont donc plus adaptés pour gérer d'énormes quantités de données XML.

Modifier: SAX ne prend pas en charge l'écriture, par conséquent, elle ne s'applique pas ici.

+0

@ Joachim - Je me suis fatigué avec JAXB, mais ne vois aucune amélioration. Pouvez-vous fournir un exemple de code pour utiliser SAX? Je suis novice à cela. – Anurag

+0

Essayez ce tutoriel: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPSAX.html –

+1

Je n'ai pas suggéré JAXB, mais si vous voulez vraiment l'utiliser, alors [ce document] (https://jaxb.dev.java.net/guide/Dealing_with_large_documents.html) pourrait donner des conseils utiles. –