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 lié au Garbage collector


Sujet :

Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Points : 210
    Points
    210
    Par défaut Problème lié au Garbage collector
    Hello !

    J'utilise la classe Logger pour générer du log. Seulement je voulais que le log s'écrive en console uniquement.
    Au lancement du programme j'ai indiqué de ne pas utiliser le flux de sortie du parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setUseParentHandlers(false);
    Ensuite j'ai créé un handler, que j'ai associé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mrh = new ModuleReaderHandler(prop.getProperty("output"));
    Logger.getLogger(ModuleReaderImpl.class.getName()).addHandler(mrh);
    A partir d'ici tout est bon, tout le log s'écrit dans mon fichier.
    Mon programme réalise un traitement qui dure environ 2 min, et au bout de 10 secondes (le temps est variable) le log se redirige en console.
    Le paramètre useParentHandler revient à true, et le handler n'est plus lié.

    En faite après avoir bien cherché, j'ai remarqué que c'est que le Garbage collector vire la référence de mon Logger, et la fois d'après où je veux écrire un nouveau log, et bien un nouveau Logger est créé, avec les propriété par défaut.

    N'y a t'il pas moyen de gérer ce problème de garbage collector ? ou alors dire, au gc de ne pas nettoyer telle ou telle classe ?

    Merci

  2. #2
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Le GC libère les objets qui ne sont plus référencé. Dans ton cas, tu ne conserve pas la référence a ton Logger.
    Il est donc libéré par le GC lors de son premier passage.
    Pour que le GC ne traite pas le logger, il te suffit que ce logger soit référencé quelque part. Si tu l'affecte simplement a une variable, cela devrait résoudre ton problème.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Logger logger = Logger.getLogger(ModuleReaderImpl.class.getName());
    logger.addHandler(mrh);
    Avec ce code, le GC ne libèrera pas le logger tant que la variable logger sera utilisé. Si ton code sort de la méthode, le GC pourra a nouveau libérer le logger. Tu peux a ce moment utiliser un attribut de ta classe à la place d'une variable dans ta méthode.

    En espérant avoir été assez clair.
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Points : 210
    Points
    210
    Par défaut
    Merci Mobius !

    Et oui tu as été on ne peut plus clair .
    Ca fonctionne now. Le pire c'est que j'étais un peu sur la bonne piste, je pensais bien que le Logger n'était pas référencé (la seule raison pour la suppression par le GC) et que le GC le gardait tant qu'il n'avait pas vraiment besoin de place. Mais je m'étais un peu embrouillé et je pensais que garder la référence à ce niveau n'aurait rien changé, et qu'il aurait plutôt fallut modifier le code au niveau des Hashtable dans la classe Logger (qui est en R/O).

    Enfin bref, résolu et merci beaucoup !

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

Discussions similaires

  1. Problème Garbage Collector
    Par ludo00002 dans le forum Firebird
    Réponses: 0
    Dernier message: 31/07/2012, 11h43
  2. [SL3] Problème avec le garbage collector
    Par DarkLeon dans le forum Silverlight
    Réponses: 3
    Dernier message: 24/06/2010, 12h14
  3. Réponses: 0
    Dernier message: 02/06/2009, 14h55
  4. [JVM] les objets et le Garbage collector
    Par Kurdran dans le forum Général Java
    Réponses: 7
    Dernier message: 02/06/2005, 16h57
  5. [Language]Garbage collector
    Par GETah dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2005, 15h18

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