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 :

Java problème de Mémoire


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 28
    Points : 18
    Points
    18
    Par défaut Java problème de Mémoire
    Bonjour,


    J'ai une appli client serveur qui tourne depuis deux ans.
    Elle sert à trasnférer des fichiers excel d'une machine vers une autre.
    Je n'ai jamais eu de souci avec, le code n'a pas été modifié.

    Depuis quelques temps,j'ai des erreurs outofmemory.
    La taille du fichier excel n'est pas très grosse 200k pour la dernière fois que j'ai eu le message.

    Qu'est ce qui pourrait causer cette erreur?
    Je ne sais pas trop ou chercher.. auriez vous des pistes?


    Merci
    Phileme

  2. #2
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Bonjour,

    Par défaut le JVM réserve 64 mb de mémoire par programme. Si on dépasse 64 mb l'exception OutOfMemoryError est levée. Votre fichier n'est pas très volumineux cependant, comme vous le savez sûrement déjà, c'est le Garbage collector qui est responsable de restituer la mémoire inutilisée périodiquement. Votre serveur transfère probablement plus de fichier qu'auparavant et le Garbage collector "n'a pas le temps" de faire un clean up.

    Deux solutions possible
    1- Forcer le garbage collector à faire le ménage
    Ajouter cette ligne dans le code ou l'on croit qu'une quantité de mémoire peut être restitué
    2- Augmenter la mémoire réservé pour votre serveur: (Solution recommandé)
    Dans ce cas il faut ajouter l'option -Xmx128M pour obtenir 128 mb de mémoire - 128 Mb est un exemple vous pouvez spécifier le nombre de Mb que vous voulez -. Par exemple, si votre application se nomme Serveur on le démarre ainsi:
    java -Xmx128M Serveur

    Pour connaitre la mémoire utilisé de votre serveur, ouvrir le gestionnaire de tâches (pour windows) tapez Ctrl+Alt+del. Vous avez la liste des processus en cours avec la quantité de mémoire utilisé.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Effectivement, cette application est de plus en plus utilisée.
    Les fichiers sont de plus en plus gros, mais souvent, le message apparait pour de petits fichiers.

    Je pourrais libérer la mémoire une fois le transfert terminé.


    Je vais essayer ca merci!


    Phileme

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par jibbi
    1- Forcer le garbage collector à faire le ménage
    Ajouter cette ligne dans le code ou l'on croit qu'une quantité de mémoire peut être restitué
    Il ne faut surtout pas appeler directement le Garbage Collector ! Non seulement cela peut aboutir à de mauvaises performances (un exemple sur le forum Difference de performances Unix/Windows d'un programme?), mais en plus cela ne résoudra pas le problème des OutOfMemoryError puisque lorsque cette exception est renvoyé le GC a déjà fait tout son possible pour libérer la mémoire...


    Donc le problème vient de ton application :
    • Soit elle a besoin de beaucoup de mémoire et tu dois alors augmenter l'espace qui lui est alloué (cf la seconde solution proposé)
    • Soit tu as des fuites de mémoires (des références conservé inutilement ou des ressources non libérées) et alors il faut corriger ton code...


    a++

  5. #5
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    J'ai lu la description du OutOfMemoryError, ta raison adiGuba .
    Faut oublier le System.gc();

  6. #6
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Pour m'être pas mal intéressé à la façon de traiter des fichiers volumineux, pour moi, l'augmentation de la mémoire réservéee à la JVM via les options Xms et Xmx ne fait que retarder un problème qui se reproduira forcément à l'avenir.
    La seule solution que j'ai trouvé jusqu'à consiste à éviter à tout prix de charger un fichier en intégralité en mémoire. Cela n'est possible qu'en faisant du découpage. Exemple : traiter un fichier ligne par ligne, plutot que de stocker toutes les lignes dans un tableau puis faire le traitement sur ce tableau.
    Par contre, je ne sais pas si la structure des fichiers excel permet de faire nu "découpage" de ce dernier.
    Tout ça pour dire qu'aujourd'hui ton fichier fait 200K et que les traitements passe avec 128Mo de mémoire, mais que se passera-t-il lorsque ton fichier fera 2Go ? ( j'exagère mais je ne serait pas surpris de voir ça d'ici qq années ).

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci pour vos réponses.

    Je n'ai pas testé le system.gc();
    Je me doute que ca n'est pas très propre, mais il me faut une solution pour me dépanner et me laisser un peu de temps.

    J'ai essayé la méthode d'augmentation de la mémoire utilisée par l'appli; j'ai mis 300Mo, mais l'appli a planté à 100 Mo. "outofmemory".
    Pas compris.

    Pour la fuite dans mon code... eh bien tout a bien marché pendant deux trois ans et la depuis janvier.Ca serait une petite , mais vicieuse fuite?? .

    Dommage, si vous avez des idées... je ne vois pas trop, étant donné que ça le fait aussi avec de petits fichiers.Même si je ne charge pas tout en mémoire,je ne crois pas que ca changera.
    J'ai l'impression qu'il y a bien un cumul de mémoire non libérée à un moment.

    Bon je continue les tests. Si quelqu'un connais ce problème.et a réussi à le résoudre...


    Phileme

  8. #8
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Vérifie le nombre de connexion lorsque ca plante. Ton serveur gère trop de connexions/fichiers au même moment?. Établie un maximum de traitement et refuse les connexions supplémentaire.

    j'ai mis 300Mo, mais l'appli a planté à 100 Mo. "outofmemory".
    Peut-être un autre processus qui prend tes ressources...
    Vérifier les nouveux locigiels qui ont été insatllé juste avant que commence le problème.

    enfin, coté hardware, vérifier la mémoire.

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    C'est bon, c'est trouvé, c'est un fichier de paramétrage chargé au début de l'appli qui a fait exploser l'occupation mémoire.( arborescence d'objet qui était de plus en plus chargée).
    L'appli ne charge plus maintenant que le nécessaire.



    Merci!! Y'a pas à dire, les incidents ca fait progresser.
    Phileme

Discussions similaires

  1. Problème de mémoire: Java heap space
    Par Benduroy dans le forum Général Java
    Réponses: 3
    Dernier message: 20/05/2011, 15h14
  2. Java heap space Exception, problème de mémoire
    Par Bobble dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 08/11/2010, 18h04
  3. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  4. [Eclipse][Java]Problème de compilation sur CTRL+S
    Par ZeKiD dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 27/05/2004, 11h49
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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