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

Java Discussion :

Un outOfMemory très bizarre


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 168
    Par défaut Un outOfMemory très bizarre
    Bonjour

    On viens de me signaler un plantage sur un serveur lié à un OutOfMemory java, voici la trace correspondante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 76864, Num elements: 38424
                    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:99)
                    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:393)
                    at java.lang.StringBuffer.append(StringBuffer.java:225)
                    at java.util.regex.Matcher.appendTail(Matcher.java:762)
                    at java.util.regex.Matcher.replaceFirst(Matcher.java:849)
                    at java.lang.String.replaceFirst(String.java:1967)
    Je ne comprend pas comment un bête "replaceFirst" peut déclencher ça !
    Voilà le code correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    page = page.replaceFirst("#HEADERS#", p_headers);
    page est une variable donc le contenu de départ est connu, par contre je ne sais pas ce qu'il y a dans p_headers....
    Si qqun a une idée de ce qui peut provoquer ça je suis preneuse !

    Par ailleurs, est ce que qqun peut me confirmer la signification de la 1ere ligne de l'erreur (Object size: 76864, Num elements: 38424), est ce que ça signifie que java a essayer d'allouer 76864 * 38424 = 2 953 422 336 octets ???

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Comme souvent avec des outofmemory dus à des memoryleaks dans ton application, ce n'est pas l'endroit où a lieu l'erreur qui compte. A moins bien sur que ta String sur laquelle tu fais le replace occupe quelques G tellement elle est grande...


    Ta mémoire est devenue tellement limite avec le temps que la moindre demande peut aboutir à un OOM. Ici tu as un objet page, qu'on peux supposer pesant quelque centaines de k (typique d'une page web) qui a besoin de faire une copie de lui même pour le replace, en gros, et qui n'a pas les 100k supplémentaires demandés.

    Ce qu'il te faut cherche c'est où est passé ta mémoire. Et là il n'y a pas d'avance, il faut utiliser un profiler qui te fera des statistiques sur les objets les plus gourmands de ton application, c'est en général quelques juors de travails pour analyser cela quand on n'a pas trop l'habitude. Et un dev qui a l'habitude des Out of memory... C'est dangereux

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Quand tu réalisé un replace dans un String en Java, tu crée systématiquement un nouvel objet en mémoire. Tu as la même problématique quand tu concatène des String sans passé par un StringBuilder.

    Si tu recherche cette erreur sur le web tu trouvera d'autre personne ayant aussi cette problématique. L'une des solutions proposé est la modification des paramètres de lancement.

    Pour le détail de l'erreur, je ne suis pas exactement sûr de la signification. Dans le doute, je ne préfère rien te confirmer ou infirmer.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 168
    Par défaut
    La fuite mémoire est bien sur possible, mais ca m'étonne : c'est une appli qui tourne en prod depuis des années, si c'était le cas on devrait avoir des plantages régulièrement.....
    Et que penser de Object size: 76864 qui laisse penser qu'il s'agit d'un gros objet alors que l'objet page est beaucoup plus petit (663b exactement)... A moins que ce soit p_header qui soit très gros, je vais essayer de vérifier si c'est possible

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Après, cela est peut-être un effet de bord d'une autre application.
    Par exemple, si une autre application a été lancé en même temps, il est possible que celle-ci consomme l'intégralité de la mémoire disponible. Ainsi Java n'est pas capable d'alloué de la mémoire supplémentaire. Car déjà prise par un autre programme.

    Peut-être aussi regarder si il y a eu un changement dans les versions utilisées. Peut-être qu'une configuration a été perdu.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  6. #6
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 168
    Par défaut
    Merci de votre aide.
    J'ai lancé qq perches dans ce sens (je n'ai pas accès moi même à la machine) et on va voir ce que ça donne, mais j'y crois pas trop : difficile d'analyser ce genre de pb à postériori ! On va essayer de surveiller la conso mémoire...

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    La jvm peut être configurée pour faire un dump lors d'un outofmemory, qui pourra être analysé avec des outils de profilage afin de déterminer ce qui occupait la mémoire au moment de l'erreur. Ce dump est peut être déjà là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -XX:-HeapDumpOnOutOfMemoryError
    Chercher un fichier .hprof qui correspond au moment du crash

Discussions similaires

  1. Valeurs de clés négatives très bizarres ...
    Par Christophe Charron dans le forum Requêtes
    Réponses: 15
    Dernier message: 30/03/2006, 10h42
  2. [JDBC] Erreur très bizarre dans ExecuteQuery
    Par boudou dans le forum JDBC
    Réponses: 6
    Dernier message: 17/03/2006, 18h33
  3. différence reload et location + pb très bizarre pour experts
    Par grinder59 dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 09/01/2006, 12h05
  4. Problème très bizarre avec COUNT
    Par Nomade95000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/10/2005, 14h12
  5. Réponses: 4
    Dernier message: 28/09/2002, 00h00

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