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 :

Problème de fuite de mémoire


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut Problème de fuite de mémoire
    Bonjour,

    j'ai un problème de fuite de mémoire dans mon programme.
    J'ai un thread qui rempli un LinkedList (remplissage excessive atteint le 200000 entré)

    j'ai un autre thread qui déclenche periodiquement un traitement sur ces entré. ensuite j'aurais pas besoin de ces entrés

    Pour ne pas copié chaque fois le contenu du premier Linked liste dans une autre qui sera utilisé par le deuxième thread.

    j'utilise alors je jeu de référence ( qui est fortement le cause de la fuite de mémoire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LinkedList < TimeStamp > resultStack;
    LinkedList < TimeStamp > newEmptyStack = new LinkedList < TimeStamp > ();
    resultStack = stack;
    stack=newEmptyStack;
    l'objet stack ne cesse pas de grossir j'ai fais un heap dump ça taille atteint 200Mo!!

    STP est ce que quelqu'un pourrai m'aider ou bien a une idée sur comment détournée se problème

    Merci d'avance

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Il faudrait plus de code que ça.

    Cela dit, je soupçonne très fortement que tu as mis le code cité dans une méthode qui prend stack en argument ; or, réassigner l'objet dans une méthode ne réassigne pas l'objet dans l'appelant (l'appel à la méthode se fait par copie de référence).

  3. #3
    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
    plus de code. En particulier, il faut le code qui vide la liste, le code qui la remplit, comment tu trimballe ces listes d'un thread à l'autre et comment tu passe le tout d'une méthode à l'autre.

  4. #4
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    plus de code. En particulier, il faut le code qui vide la liste,
    Je vide la liste par cette instruction: je crée un nouvelle liste vide et je l'assigne à l'ansienne liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Vector < TimeStamp > newEmptyStack = new Vector < TimeStamp > ();
    // ensuite l'ancienne liste stack
    stack=newEmptyStack;
    le code qui la remplit, comment tu trimballe ces listes d'un thread à l'autre et comment tu passe le tout d'une méthode à l'autre.
    le bout de code initial ce trouve dans une méthode qui donne en retour l'ancienne liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resultStack = stack;

  5. #5
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Il faudrait plus de code que ça.

    Cela dit, je soupçonne très fortement que tu as mis le code cité dans une méthode qui prend stack en argument ; or, réassigner l'objet dans une méthode ne réassigne pas l'objet dans l'appelant (l'appel à la méthode se fait par copie de référence).
    je fais l'appel comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (TimeStamp timeStamp : TimeStampStack.fetchTimeStamps())
    le code de la méthode fetchTimeStamps est :
    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
     
    public static LinkedList < TimeStamp > fetchTimeStamps() {
    		LinkedList < TimeStamp > resultStack;
    		// the new empty stack is created here to be ready-to-use in the
    		// synchronized block
     
    		LinkedList < TimeStamp > newEmptyStack = new LinkedList < TimeStamp > ();
    		//resultStack = (LinkedList < TimeStamp >)stack.clone();
    		resultStack = stack;
    		// if a TS is added here (between these two sync blocks) it belongs
    		// still to the stack being collected
    		stack = newEmptyStack;
    		// if a TS is added at this place it will be collected next time
     
    		return resultStack;
    	}

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bon, mais puisqu'elle a été affectée à resultStack, cette référence reste accessible. Quand est-ce qu'elle est censée être perdue et collectable par le garbage collector ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    en gros, l'appelant de ta méthode

    1) il en fait quoi?
    2) est-ce qu'il la vide.

    Parce que pour le moment tu n'a montré aucun code qui vidait ta liste ou qui jetais ta liste, juste du code qui la déplace. De plus on vois toujours pas ce que tu en fais de ta liste, comment tu la rempli, et comment tout ça s'agence en pratique. Donc, s'il te plait, pourrais-tu nou poster un code complet qui reproduit ton problème.

    Parce que pour le moment c'est un jeu de piste, et on aime pas la rétention d'information qui conduit à des jeux de piste à coup de deux lignes de code par ci, trois lignes par là.

  8. #8
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    en gros, l'appelant de ta méthode

    1) il en fait quoi?
    2) est-ce qu'il la vide.
    en faite la méthode fetchTimeStamps() est appelé par une autre méthode qui traite les éléments de la liste. normalement aprés le traitement la liste retournée par fetchTimeStamps() ne sera pa référencé et elle doit etre collecté.

    la méthode fetchTimeStamps() pour moi elle retourne l'ancienne liste et vide la liste ancienne par la création d'un nouvelle liste vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Vector < TimeStamp > newEmptyStack = new Vector < TimeStamp > ();
    // ensuite l'ancienne liste stack
    stack=newEmptyStack;
    c'est comme ça comment je vide ma liste.

    pour le remplissage j'ai une méthode ajoute les éléments dans la liste stack.

    Pour le code d'ajout et du traitement il est trop long et ne va pas ajouté des information utile.

    Une information qui peut etre utile, j'ai deux thread l'un rempli la liste (stack) et l'autre extraire periodiquement les éléments de liste stack et les traite.
    de façon statique

  9. #9
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Bon, mais puisqu'elle a été affectée à resultStack, cette référence reste accessible. Quand est-ce qu'elle est censée être perdue et collectable par le garbage collector ?
    Normalement à la sortie de la méthode : fetchTimeStamps() cette référence ne sera perdu et donc collectable.

    mais je c pas pourquoi c pa le cas

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

Discussions similaires

  1. Problème de fuite de mémoire
    Par mickael_moopenn dans le forum Débuter
    Réponses: 3
    Dernier message: 18/07/2008, 00h03
  2. Problème de fuite de mémoire avec GTK+
    Par gwenhael dans le forum GTK+
    Réponses: 15
    Dernier message: 03/01/2008, 16h22
  3. [VB6] Problème de fuite mémoire
    Par GyLes dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/03/2007, 14h58
  4. [C++] problème de fuite mémoire
    Par Cirdan Telemnar dans le forum C++
    Réponses: 26
    Dernier message: 16/06/2006, 10h16
  5. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29

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