mekhanik
Messages postés33Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention20 mai 2007
-
20 mai 2007 à 18:58
mekhanik
Messages postés33Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention20 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 !
mekhanik
Messages postés33Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention20 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 ////////////////////////////
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
mekhanik
Messages postés33Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention20 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 !