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 :

"java.lang.OutOfMemoryError" lors du chargement d'un shéma xsd [XSD]


Sujet :

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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut "java.lang.OutOfMemoryError" lors du chargement d'un shéma xsd
    Bonjour,

    Java me renvoie un message d'erreur lors de l'exécution d'un programme :
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    En mode debugging, j'ai constaté que ce message d'erreur survient sur cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    schema = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(schemaFile);
    J'ai essayé de modifier les paramètres de mémoire (-Xms512M -Xmx512M) allant même jusqu'à 1024M, mais rien à faire, toujours le même message d'erreur.

    Es-ce que quelqu'un aurait une idée de ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Points : 17 036
    Points
    17 036
    Par défaut
    Bonjour,
    Citation Envoyé par scalpa63 Voir le message
    J'ai essayé de modifier les paramètres de mémoire (-Xms512M -Xmx512M)
    A quel endroit ?

    Au minimum, il faut le faire pour la configuration de lancement de ton application, au niveau des arguments de VM. Cf. http://eclipse.developpez.com/faq/in...#argumentsJVM2
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Oui, c'est dans la zone "VM Arguments" que j'avais plaçé ces paramètres.

    Merci.

    Pascal.

  4. #4
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Points : 17 036
    Points
    17 036
    Par défaut
    Ah... dans ce cas c'est effectivement un problème de mémoire à cause de ton fichier de schéma on dirait.
    Il fait quelle taille, est-il composé d'autres fichiers de schéma ?
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    J'ai 3 fichiers de schémas XSD.

    Il font, à tout casser, 60 K-octets, les 3 réunis, c'est pas énorme.

    Merci.

    Pascal.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 288
    Points : 261
    Points
    261
    Par défaut
    60 ko qui font un OutOfMemory c'est bizarre. Est ce qu'on peut voir ton code ?
    Merci de lire les règles du forum et surtout celle là Message clair et précis.
    Evitons les ctrl c ctrl v => Ne sortons pas les codes de leur contexte sinon ça ne marche pas.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Voici le code

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    public class EcritureFichierXML  
     {
         private Writer out;
         private Marshaller marshaller;
         public static final String FILE_ENCODING = "UTF-8"; // "ISO-8859-1" ou "ISO-8859-15" ou "UTF-16"
         private static Logger log = Logger.getLogger(EcritureFichierXML.class);
     
         /**
          *  
          * Constructeur initialisant l'objet Marshall
          * @param nomFichierSortie Le chemin complet du fichier de sortie  
          * @throws IOException
          */
         public EcritureFichierXML(String nomFichierSortie) throws IOException  
         {    
             out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(nomFichierSortie), FILE_ENCODING));    
     
             try {
     
                 JAXBContext jc = JAXBContext.newInstance( "de.kba.verwendungsnachweis" );
     
                 Schema schema = null ;
                 // FIXME : impossible de charger le shéma : à voir
     
                 try {
                     // creation de l'instance chemin
                     File schemaFile = new File("Ressources/vwn_extern_V_1_0.xsd");
                     // creation de l'instance schema xsd
                     schema = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(schemaFile);
                 } catch (SAXException e) {
                     log.error("Impossible de lire le schéma XML (fichiers XSD)", e);
                 }
     
                 marshaller = jc.createMarshaller();
                 marshaller.setSchema(schema);
                 // Permet de tabulé
                 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.valueOf(true));
     
             } catch (JAXBException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
                 log.error("Impossible de lire le schéma XML (fichiers XSD)", e);
             }
         }
     
         /**
          * Ecriture d'un enregistrement RECORD du fichier XML de sortie
          * @param record Enregistrement du fichier
          * @throws ErreurFichierTraitement
          * @throws JAXBException  
          * @throws FileNotFoundException  
          * @throws UnsupportedEncodingException  
          */
         public void writeServiceDMR(ContainerTyp newContainerTyp  ) throws ErreurFichierTraitement, JAXBException, UnsupportedEncodingException, FileNotFoundException  
         {
             try  
             {
                 marshaller.marshal(newContainerTyp, out);                
             }  
             catch (MarshalException e1)  
             {
                 log.fatal("Marshall impossible : (constitution du fichier XML)");
                 e1.printStackTrace();
                 throw new ErreurFichierTraitement("Marshall impossible : (constitution du fichier XML)");
             }  
             catch (ValidationException e1)  
             {
                 log.fatal("Le fichier a un format non valide");
                 e1.printStackTrace();
                 throw new ErreurFichierTraitement("Le fichier a un format non valide)");
             }
         }
     }
    Ca plante au niveau du code File schemaFile = new File("Ressources/vwn_extern_V_1_0.xsd")Merci.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Avez-vous besoin d'éléments supplémentaires ?

    Merci.

    Pascal.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    Si je me souviens bien le marshaller ne ferme pas le flux de sortie, il faut rajouter un close().
    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
     
    try  
             {
                 marshaller.marshal(newContainerTyp, out);                
             }  
             catch (MarshalException e1)  
             {
                 log.fatal("Marshall impossible : (constitution du fichier XML)");
                 e1.printStackTrace();
                 throw new ErreurFichierTraitement("Marshall impossible : (constitution du fichier XML)");
             }  
             catch (ValidationException e1)  
             {
                 log.fatal("Le fichier a un format non valide");
                 e1.printStackTrace();
                 throw new ErreurFichierTraitement("Le fichier a un format non valide)");
             }finally {
                   out.close();
              }
    Sinon je ne vois pas bien non plus d'où cela peut venir.
    Une solution possible de diagnostique est de rajouter l'option -XX:+HeapDumpOnOutOfMemoryError en arguments de la VM et d'analyser le dump généré avec Eclipse MAT par exemple. Cela donnerait au moins la répartition des objets en mémoire et permettraire d'identifier quels objets posent problème.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Bonjour et Merci.

    Sinon, j'ai eu la réponse par ailleurs :

    Le problème vient d'une limitation connue de l'implémentation Xerces présente dans Java : cf. bugs Sun http://bugs.sun.com/bugdatabase/view...bug_id=6449928 + associés.
    En synthèse cela vient de maxOccurs trop important dans un fichier Xsd, il est conseillé de ne pas dépasser 5 000.
    Dans votre cas : Fichier Ressources/vwn_extern_V_1_0.xsd, élement Record :
    maxOccurs="50000"/>
    Des solutions techniques (jvm différente, xerces indépendant, etc) pourraient éventuellement être envisagées, sans garantir que le problème disparaisse complètement.
    Le 50 000 représente il quelque chose fonctionnellement ?? il serait peut être plus judicieux de revoir cette valeur ... en indiquant que le nombre peut être infini .... cela permettrait de gagner énormément de temps (pas d'instanciation de gros tableau en mémoire).
    En modifiant la valeur du maxOccurs à :
    • 10 000, le chargement du XSD met 3 minutes.
    • 5 000, le chargement du XSD met 22 secondes.
    • 500, le chargement du XSD met 520 millisecondes.
    • unbounded, le chargement du fichier XSD met 450 millisecondes.
    Merci.

    Pascal.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/09/2009, 19h45
  2. Réponses: 3
    Dernier message: 24/04/2008, 12h09
  3. [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