IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

[FOP] probleme java.lang.OutOfMemoryError


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Points : 22
    Points
    22
    Par défaut [FOP] probleme java.lang.OutOfMemoryError
    Bonjour,

    J'ai un problème de java.lang.OutOfMemoryError sous fop pendant la création de pdf.
    Cet erreur ne survient pas lorsque les fichiers xml sont de petites tailles, mais seulement sur les gros.

    Je suis sur plateforme Unix avec un jdk 1.4.1_03. J'ai vu que cela pouvait etre la source du conflit (passage en 1.5?) mais je vous demande confirmation car le changement de jdk sur le serveur est à éviter si possible.
    Sinon existe-t'il d'autres solutions?

    A tout hazard, j'utilise la méthode suivante:
    public void generatePdfFile(String xmlFilePathString, String xslFilePathString, String pdfFilePathString)
    {
    try {
    //Setup input and output files
    File xmlFile = new File(xmlFilePathString);
    File xslFile = new File(xslFilePathString);
    File pdfFile = new File(pdfFilePathString);

    //Construct driver
    Driver driver = new Driver();

    m_logger.setPriority(Priority.INFO);
    driver.setLogger(new org.apache.avalon.framework.logger.LogKitLogger(m_logger));
    driver.setLogger(new org.apache.avalon.framework.logger.NullLogger());

    //Setup Renderer (output format)
    driver.setRenderer(Driver.RENDER_PDF);

    //Setup output
    OutputStream out = new java.io.FileOutputStream(pdfFile);
    driver.setOutputStream(out);

    //Setup XSLT
    TransformerFactory factory = TransformerFactory.newInstance();
    //Transformer transformer = factory.newTransformer(new StreamSource(xslFile));

    Source xsl = new StreamSource(xslFile);
    Transformer transformer = factory.newTransformer(xsl);



    //Setup input for XSLT transformation
    Source src = new StreamSource(xmlFile);

    //Resulting SAX events (the generated FO) must be piped through to FOP
    Result res = new SAXResult(driver.getContentHandler());

    //Start XSLT transformation and FOP processing
    transformer.transform(src, res);

    out.close();

    }catch(Exception e){
    e.printStackTrace();
    }
    }
    J'utilise les .jar suivant:
    avalon, fop, xalan2.7, xerces, jfor, logkit.

    Voila si quelqu'un peu m'aider un peu, car je suis bien bloqué la dessus

    Merci.

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    C'est un problème inhérent à FOP et il n'y malheureusement pas de solution.
    Le seul work-around c'est d'augmenter la taille de la jvm avec -Xms et -Xmx.

    Normalement FOP est entrain d'être massivement redesigner et donc cela devrait résoudre le problème.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Merci Zekey pour ta réponse.

    Ca ne m'arrange mais alors pas du tout qu'il n'y ait pas de solution...
    Est-ce que cette erreur depend directement de la taille du .xml a formater?
    Si oui, mon .xml maxi atteingnant environ 700Ko, quelles valeurs de -Xmx et -Xms sembleraient correctes?


    Ceci dit j'obtiens aussi parfois le message d'erreur suivant:
    javax.xml.transform.TransformerException: org.apache.xml.dtm.DTMException: No more DTM IDs are available
    toujour a la suite d'une tentative de formatage d'un .xml un peu volumineux...


    En me renseignant, je vois que cette erreur est le résultat d'un 'conflit' entre le JRE1.4 et Xalan 2.2.1 fourni avec.

    Pourtant dans mon classpath, je spécifie bien d'utiliser le Xalan.jar, version 2.7, que j'ai récupéré sur le net.

    Là je ne comprend pas trop comment faire pour utiliser MA version de xalan, puisque pour ce .jar particulier, java semble ne pas tenir compte du classpath ?

    Merci.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Apparement ce que j'en ai compris c'est qu'il ne me faut pas passer directement par le ClassPath (je ne sais pas pourquoi mais bon ^^), mais ajouter ma version de Xalan2.7 dans le répertoire $JRE_HOME/lib/endorsed de mon JDK...

    Probleme mon JDK ne contient pas de répertoire /endorsed ?
    Faut-il le créer manuellement (désolé mais je ne peux pas trop tester, n'ayant pas les droits qui vont bien pour toucher au Jdk)?


    Merci.


    PS: voici ce que j'obtiens apres un environment report :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #---- BEGIN writeEnvironmentReport($Revision: 1.7 $): Useful properties found: ----
    java.version=1.4.1_03
    #---- BEGIN Listing XML-related jars in: foundclasses.java.class.path ----
    xalan.jar-apparent.version=xalan.jar WARNING.present-unknown-version
    xalan.jar-path=/tmp/temp_classpath/xalan.jar
    xerces.jar-path=/tmp/temp_classpath/xerces.jar
    xerces.jar-apparent.version=xerces.jar WARNING.present-unknown-version
    xsltc.jar-apparent.version=xsltc.jar present-unknown-version
    xsltc.jar-path=/tmp/temp_classpath/xsltc.jar
    #----- END Listing XML-related jars in: foundclasses.java.class.path -----
    version.JAXP=1.1
    java.ext.dirs=/rep/JDK-1.4/j2se/jre/lib/ext
    version.crimson=not-present
    version.SAX=2.0
    java.class.path=/tmp/temp_classpath/fop.jar:/tmp/temp_classpath/avalon.jar:/tmp/temp_classpath/batik.jar:/tmp/temp_classpath/jfor.jar:/tmp/temp_classpath/logkit.jar:/tmp/temp_classpath/serializer.jar:/tmp/temp_classpath/xalan2_7.jar:/tmp/temp_classpath/xerces.jar:/tmp/temp_classpath/xml-apis.jar:/tmp/temp_classpath/xsltc.jar:/project/kernel/format.jar
    version.xerces=not-present
    sun.boot.class.path=/rep/JDK-1.4/j2se/jre/lib/rt.jar:/rep/JDK-1.4/j2se/jre/lib/i18n.jar:/rep/JDK-1.4/j2se/jre/lib/sunrsasign.jar:/rep/JDK-1.4/j2se/jre/lib/jsse.jar:/rep/JDK-1.4/j2se/jre/lib/jce.jar:/rep/JDK-1.4/j2se/jre/lib/charsets.jar:/rep/JDK-1.4/j2se/jre/classes
    version.DOM.draftlevel=2.0fd
    version.xalan2=Xalan;Java;Xalan Java 2.2.D11;
    version.DOM=2.0
    version.xalan1=not-present
    #----- END writeEnvironmentReport: Useful properties found: -----
    # YAHOO! Your environment seems to be OK.
    [WARNING] Screen logger not set - Using ConsoleLogger.
    [INFO] setting up fonts
    javax.xml.transform.TransformerException: org.apache.xml.dtm.DTMException: No more DTM IDs are available
            at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1226)
            at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:638)
            at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1088)
            at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1066)
            at project.format.FormatXmlFile.generatePdfFile(FormatXmlFile.java:120)
    ...

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Citation Envoyé par Méta
    Faut-il le créer manuellement (désolé mais je ne peux pas trop tester, n'ayant pas les droits qui vont bien pour toucher au Jdk)?
    Effectivement, il faut que tu le crées toi-même, et que tu y places xalan.jar, ainsi que quelques autres. C'est le seul moyen pour que Java n'utilise pas la version plus ancienne de Xalan livrée avec le JDK 1.4 (une 2.4 quelque chose si mes souvenirs sont bons).

    Tu trouveras tous les détails ici : http://xml.apache.org/xalan-j/faq.html#faq-N100D6

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ASE 12.5.4]probleme : java.lang.OutOfMemoryError
    Par kei-kun dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 05/04/2007, 15h59
  2. [ASE 12.5.4]probleme : java.lang.OutOfMemoryError
    Par kei-kun dans le forum Sybase
    Réponses: 2
    Dernier message: 05/04/2007, 15h59
  3. [webService][Axis] java.lang.OutOfMemoryError
    Par webspeak dans le forum Services Web
    Réponses: 8
    Dernier message: 25/04/2005, 17h58
  4. [Strategie]Pb de java.lang.OutOfMemoryError
    Par eaque dans le forum Général Java
    Réponses: 3
    Dernier message: 06/04/2005, 11h01
  5. [JSP] pb " java.lang.outOfMemoryError "
    Par lthomas dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 31/03/2005, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo