Fuite mémoire dans mon programme Java

mekhanik Messages postés 33 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 20 mai 2007 - 20 mai 2007 à 18:58
mekhanik Messages postés 33 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 20 mai 2007 - 20 mai 2007 à 23:31
Bonjour,
j'ai développé un programme java qui communique avec une dll via JNI. J'étais entrain de corriger ma DLL pour supprimer les fuites mémoires et je m'aperçois que mon programme java en génere aussi ??
Mon programme est constitué d'un thread qui toute les secondes invoque une méthode.
J'ai simplifié cette méthode au minimum :

synchronized public void lancerTraitementProjet()
    {
        Set mesProjets;
        Set mesLogicielsASurv;
         mesLogicielsASurv = new HashSet();
         mesProjets = new HashSet();
        mesProjets = null;
        mesLogicielsASurv = null;
    }

et je remarque grâce au gestionnaire des tâches que mon la mémoire utile de mon application augmente de 4 octets indéfiniment très régulièrement (un peu plus d'une seconde).
J'aimerais donc avoir des informations sur ce problème (origine, cause, correction ...)
Merci !

3 réponses

sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
20 mai 2007 à 19:30
tu donne pas assez d'infos et la methode non simplifie ca donne quoi?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
mekhanik Messages postés 33 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 20 mai 2007
20 mai 2007 à 19:40
Pour complément je met mets deux classes utilisées ainsi que mon main :

///////////////////////////////////////////////////////////////// Thread SurvProjet ////////////////////////////
public class SurvProjet extends Thread{

        private SurvMetier monSurvMetier;
       
        public SurvProjet(SurvMetier survMetier)
        {
            monSurvMetier = survMetier;
        }
       
        public void run()
        {
            while(true)
            {
                try
                {
                    monSurvMetier.lancerTraitementProjet();
                    sleep(1000);
                }
                catch(InterruptedException e)
                {
                    System.out.println("Thread SurvProjet interrompu dans son sommeil");
                }
            }
        }
}
/////////////////////////////////////////////////////////////////  Classe SurvMetier  ////////////////////////////

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;

public class SurvMetier {
    private Thread monThreadSurvProjet;
    private Metier monMetier;
   
    public SurvMetier()
    {
        monThreadSurvProjet = new SurvProjet(this);
    }
   
    public void demarrerSurveillance()
    {
        monThreadSurvProjet.start();
    }
   
   synchronized public void lancerTraitementProjet()
    {
        Set mesProjets;
        Set mesLogicielsASurv;
         mesLogicielsASurv = new HashSet();
         mesProjets = new HashSet();
        mesProjets = null;
        mesLogicielsASurv = null;
    }
   
}

///////////////////////////////////////////////////////////////// Main  ////////////////////////////

public class MainApiInterruptSC {

    public static void main(String[] args) {
        SurvMetier timerEcoute = new SurvMetier();
        timerEcoute.demarrerSurveillance();
    }

}

Tout "le reste" est en commentaire et n'a donc aucune influence.
Je peux fournir tout autre info sur le fonctionnenement si besoin
0
mekhanik Messages postés 33 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 20 mai 2007
20 mai 2007 à 23:31
Juste pour information, au cour de mes recherches, j'ai trouver des articles sur la gestion de la mémoire par le garbage collector de java. Apparemment, celui-ci ne s'éxécute que lorsque la consommation de la mémoire est grande. De plus il n'est efficace que pour les objets non référencés (ce qui est logique). Mais je ne m'explique toujours pas pourquoi la mémoire augmente car les objets créés dans une méthode sont bien détruis en fin de méthode ? et les objets composants d'un objet sont bien référencés qu'une seule fois à la création de l'objet parent et donc leur place en mémoire n'augmente pas à chaque utilisation de l'objet ? Y a t-il des exceptions pour les thread ou pour les méthodes synchronized ?
Merci de m'éclaircir !
0
Rejoignez-nous