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

Langage Java Discussion :

probleme de OutOfMemory


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Par défaut probleme de OutOfMemory
    Bonjour,

    j'essai de corriger un probleme d'en appli qui fait un import de donnée assé conséquent.

    En gros apres 20 minute d'import de données on se prend dans la face un :
    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
    !ENTRY org.eclipse.core.jobs 4 2 2009-04-23 17:13:56.632
    !MESSAGE An internal error occurred during: "Importing Simulation Results".
    !STACK 0
    java.lang.OutOfMemoryError: GC overhead limit exceeded
    	at java.util.regex.Matcher.<init>(Matcher.java:207)
    	at java.util.regex.Pattern.matcher(Pattern.java:888)
    	at fr.ifp.first.externalapp.PropertyMatcher.find(PropertyMatcher.java:201)
    	at fr.ifp.first.externalapp.ui.io.ExternalDelegateParser.saveProductionResults(ExternalDelegateParser.java:630)
    	at fr.ifp.first.externalapp.ui.io.ExternalDelegateParser.saveProductionResults(ExternalDelegateParser.java:513)
    	at fr.ifp.first.externalapp.ui.io.ExternalDelegateParser.addDataToStorage(ExternalDelegateParser.java:201)
    	at fr.ifp.first.externalapp.outputparser.AbstractOutputFileParser.addDataToStorage(AbstractOutputFileParser.java:65)
    	at fr.ifp.first.externalapp.outputparser.XSILParser.parse(XSILParser.java:179)
    	at fr.ifp.first.externalapp.outputparser.AbstractDelegateParser.parse(AbstractDelegateParser.java:52)
    	at fr.ifp.first.externalapp.outputparser.DefaultDelegateParser.addSelectedResultsToStorage(DefaultDelegateParser.java:65)
    	at fr.ifp.first.externalapp.ui.io.ExternalImportJob.loadResults(ExternalImportJob.java:284)
    	at fr.ifp.first.externalapp.ui.io.ExternalImportJob.run(ExternalImportJob.java:143)
    	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
     
    !ENTRY org.eclipse.core.jobs 4 2 2009-04-23 17:46:15.286
    !MESSAGE An internal error occurred during: "Importing Simulation Results".
    !STACK 0
    java.lang.OutOfMemoryError: GC overhead limit exceeded
    Ce qui vous me l'accorderez est fort désagréable.
    Mais il s'avère que ce bug vient de ce code si:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     public int find(String key) {
            synchronized (patterns) {
                key = key.toLowerCase();
                for (Pattern pattern : patterns) {
                   Matcher matcher = pattern.matcher(key); 
                    if (matcher.find()) {
                        return properties.get(pattern);
                    }
                }
                return DefineProperty.UNKNOWN_TYPE.code();
            }
        }
    Est ce que quelqun sait ce qui est la cause d'un outofmemory sur les matcher ???

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    Pattern.matcher() est consommateur, si la mémoire devient insuffisante il est possible que ça plante à ce moment là...
    Tous les essais plantent au même endroit (dans Pattern.matcher()) ?
    Tu as essayé d'augmenter la mémoire pour voir s'il tient plus longtemps ?
    Quelle est la volumétrie : combien de lignes importées et combien de Pattern testés ? Est-ce que tu peux montrer un exemple de Pattern et de clé testés ?
    Dernière question : pourquoi synchroniser les patterns ? Il me semble que Pattern est thread-safe mais pas Matcher, si tu crées un Matcher à chaque fois, pas de problème dans ton code à part la mémoire... ou alors tu peux réutiliser le matcher avec reset().

  3. #3
    Membre éclairé Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Par défaut
    Merci pour tes réponses.
    1: tous les essais plante effectivement à cette ligne.
    2: avec une mémoire plus importante ca marche, mais les contraintes des clients à qui est fourni cette application m'oblige a trouver une solution Java au probleme.
    3: Je pense comme tu l'a indiqué que c'est peut etre de créer et recréer des Matcher qui cause le problème. Je vais essayer la solution du reset.
    (pour indication le patterns contient a chaque fois 1019 element, et la clé key est un string du genre "ppmmi").

    Merci

  4. #4
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    clé key est un string du genre "ppmmi"
    Tu es certain d'avoir besoin de Pattern ?

    Il peut y avoir beaucoup d'optimisation possible dans les expressions rationnelles, les remplacer par des String.indexOf(), faire des tests (if(key.startsWith("p")) avant, les simplifier, les regrouper pour séparer tes 1019 cas après, etc...
    Si le reset ne marche pas, donne quelques exemples d'expressions et de clés.

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 688
    Par défaut
    clé key est un string du genre "ppmmi"
    Si tes expressions régulières ne contiennent aucun caractère spécial qui fait l'interet des expression régulière, autant ne pas les utiliser.

    La méthode contains() de la classe String est suffisante pour remplacer ton find() et sera moins consommatrice en mémoire et plus rapide.

  6. #6
    Membre éclairé Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Par défaut
    Bonjour,

    Oui je suis certain de devoir utilisé des Patterns car les clé sont pas toutes comme je l'avais décris au dessus.

    De plus pour revenir sur la ligne synchronized(patterns)... en fait patterns est une Arraylist à cette endrois.

    Je corrige des bugs de programme que je n'ai pas codé moi meme donc desolé si je suis un peu flou.

    Merci

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

Discussions similaires

  1. probleme outOfMemory java
    Par flora806 dans le forum Langage
    Réponses: 6
    Dernier message: 28/02/2008, 16h40
  2. [OutOfMemory] probleme de delestage
    Par pierre.zelb dans le forum Général Java
    Réponses: 14
    Dernier message: 06/07/2005, 13h05
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 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