1 votes

java OutOfMemoryError (erreur de mémoire)

J'exécute la commande suivante sur une machine Unix.

java -Xms3800m -Xmx3800m org.apache.xalan.xslt.Process -out Cust.txt -in test13l.xml -xsl CustDetails.xsl

Il s'agit d'une commande java, qui appelle le processeur Xalan pour analyser le fichier xml (test131.xml) en utilisant la feuille de style xsl (CustDetails.xsl) et retourne Cust.txt.

La commande fonctionne bien et la sortie est générée. Il faut 12 minutes pour traiter un fichier xml de 1,1 Go. Il faut 22 minutes pour traiter un fichier de 1,44 Go. Cependant, lorsque j'essaie de traiter un fichier de 1,66 Go, le message suivant s'affiche :

(Emplacement de l'erreur inconnu)Erreur XSLT (java.lang.OutOfMemoryError) : null

J'ai augmenté la taille du tas de java à 3800, je ne sais pas ce que je peux faire de plus.

Merci beaucoup pour votre aide.

2voto

Hardcoded Points 2786

Xalan peut utiliser un analyseur DOM ou SAX en dessous.

Les analyseurs DOM essaient généralement de lire tout le fichier en une seule fois et de construire un arbre à partir de celui-ci, ce qui consomme beaucoup de mémoire sur les gros fichiers.

Les analyseurs SAX, quant à eux, déclenchent des événements pendant l'analyse et n'ont donc pas besoin de garder tout le fichier en mémoire (mais vous ne pouvez pas accéder à l'arbre aussi facilement).

Assurez-vous que votre Xalan utilise un analyseur syntaxique SAX en dessous. Vous pouvez trouver une description de la manière de procéder ici : http://xml.apache.org/xalan-j/usagepatterns.html#sax

1voto

Amir Afghani Points 17519

Exécutez-vous un processus Java 64 bits ou un processus Java 32 bits ? De quelle quantité de mémoire disposez-vous réellement sur le système ? Quelle est la trace complète de la pile pour votre OOM ? Quelle version de la JVM exécutez-vous ? Vous pouvez toujours exécuter JConsole, vider le tas et l'ouvrir dans un outil comme Eclipse MAT pour voir quels objets occupent le tas. Selon la version de votre JVM, vous pouvez exécuter votre processus avec -XX:+HeapDumpOnOutOfMemory et ouvrir le vidage après que le processus Java ait épuisé sa mémoire.

0voto

dimitko Points 1408

Produire un arbre DOM géant dans la mémoire n'est pas la bonne solution ; trouvez un moyen d'alimenter votre transformateur XSL avec des événements XML, comme l'API SAX ou StAX. N'utilisez jamais l'API DOM sur des fichiers XML aussi massifs (1.1GB semble effrayant).

Si vous utilisez Java 6, jetez un coup d'œil aux paquets javax.xml.transform.sax y javax.xml.transform.stax pour référence, que devrait mettre en œuvre votre solution pour que cela fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X