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 :

GC + static + weakreference


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut GC + static + weakreference
    Bonjour,

    Je viens de recuperer une application et je me rend compte que les finalize ne sont pas du tout appele lors de la destruction de certains objets.
    Quelles pourraient etre les raisons de ce "non-appel"?

    J'ai suppose que cela viendrait des objets statiques presents dans ces classes.
    Comme l'objet static n'est pas vide, alors il n'appelle pas le finalize.

    Mais si c'est bien cela, alors, j'ai un paquet d'objet static a vider...

    J'ai aussi vu des choses sur les weak reference mais je n'ai pas bien compris l'utilite...

    Merci!

  2. #2
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par vince3320
    J'ai suppose que cela viendrait des objets statiques presents dans ces classes.
    Comme l'objet static n'est pas vide, alors il n'appelle pas le finalize.
    Non, ça ne peut pas être ça. Les objets statics appartiennent à la classe et non aux objets qui sont des instances de cette classe.
    Par conséquent, si un objet n'est plus référencé mais qu'un membre static de la classe qu'il instancie est référencé quelque part, il est quand même bon à être garbage collecté.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Un objet peut être finalizé à partir du moment ou il n'y a plus de référence sur l'objet. Effectivement, si tu as un attribut static sur un objet, il ne sera pas libéré. Il faut mettre la référence static à null.

    Une WeakReference est une référence particuliere, qui n'empeche pas l'objet d'être libéré. C'est a dire que s'il n'y a plus de references directes sur ton objet, il va être libéré. Mais tu ne maitrise pas le moment ou il va être libéré (ca depend du type de WeakReference)

    Utiliser une WeakReference necessite une modification dans le code (pas seulement le type, mais également à chaque utilisation). Ce qui est sans doute plus compliqué que de mettre les references static à null.

  4. #4
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut GarbageCollect with java.lang.ref!
    Citation Envoyé par Sanguko
    (...)
    Une WeakReference est une référence particuliere, qui n'empeche pas l'objet d'être libéré. C'est a dire que s'il n'y a plus de references directes sur ton objet, il va être libéré. Mais tu ne maitrise pas le moment ou il va être libéré (ca depend du type de WeakReference)

    Utiliser une WeakReference necessite une modification dans le code (pas seulement le type, mais également à chaque utilisation). Ce qui est sans doute plus compliqué que de mettre les references static à null.
    Je pense que tu maîtrises le moment de libération de l'adresse mémoire. C'est pourquoi il existe une liste d'attente ((ReferenceQueue)refQueue).poll() dans le package ref. Et surtout lors de l'appel sur la liste, c'est comme la poste il faut appeler encore la méthode ((Reference)ref).clear() de Reference pour s'assurer de la libération de l'adresse.
    Seulement, faites attention au GarbageCollector, il n'est pas possible de le contrôler en continu, car il se bloquerait immédiatement vu les resources System qu'il utilise déjà!

    Aussi, System.gc() est à prendre avec des pincettes à linge...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Merci pour vos reponses!

    Donc pourquoi mon finalize n'est pas appeler?
    Il suffit normalement de mettre mon obj a null, non?

    Et dans ce cas, il me suffit de liberer les variables static dans le finalize.

    Ok pour les weak...
    Si je peux eviter de modifier tout ce code, c'est pas plus mal.

    Par contre, je vais devoir refaire tous les finalize pour que chaque classe gere bien ses objets statics...

  6. #6
    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 vince3320
    Donc pourquoi mon finalize n'est pas appeler?
    Il suffit normalement de mettre mon obj a null, non?
    Oui cela suffit, il faut bien sûr qu'aucune autres références sur le même objets ne pointe vers le même objet...

    Sinon une remarques : lorsque ton applications se termine les méthodes finalize() ne sont pas appelée...


    Citation Envoyé par vince3320
    Et dans ce cas, il me suffit de liberer les variables static dans le finalize.
    C'est quoi ces variables static et pourquoi voudrais-tu les libérer ???
    Cela me semble un peu louche... Tu pourrais nous montrer un exemple de code ?

    Et pourquoi utilises-tu finalize() au fait ?

    a++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Oui cela suffit, il faut bien sûr qu'aucune autres références sur le même objets ne pointe vers le même objet...
    Oui je pense que le coeur du probleme est la.

    lorsque ton applications se termine les méthodes finalize() ne sont pas appelée...
    Ok mais ce n'est pas la fin de l'application.

    Je veux les vider en fait.
    Ce sont pour la plupart des map qui contiennent de plus en plus d'objet!
    Donc un clear au bon moment est le bienvenue...

    Le code que je reprend utilise des fonctions finalize et je t'avoue que je n'en vois pas l'interet...
    Mais puisqu'elle existe, je vais vider mes map dedans.

    Et pour que ces methodes soient appeles, je vais chercher la vilaine reference restante!

    Merci a vous!

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par broumbroum
    Je pense que tu maîtrises le moment de libération de l'adresse mémoire. C'est pourquoi il existe une liste d'attente ((ReferenceQueue)refQueue).poll() dans le package ref. Et surtout lors de l'appel sur la liste, c'est comme la poste il faut appeler encore la méthode ((Reference)ref).clear() de Reference pour s'assurer de la libération de l'adresse.
    Seulement, faites attention au GarbageCollector, il n'est pas possible de le contrôler en continu, car il se bloquerait immédiatement vu les resources System qu'il utilise déjà!

    Aussi, System.gc() est à prendre avec des pincettes à linge...
    Reference.clear() n'est qu'une indication pour le gc.

    ReferenceQueue est un objet qui permet de suivre le changement d'état des references. En d'autres termes, son role n'est pas de faire changer l'état des références.

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

Discussions similaires

  1. thread et méthodes static
    Par sylpichard dans le forum MFC
    Réponses: 3
    Dernier message: 02/06/2004, 17h12
  2. Problème avec l'option -static de gcc
    Par lsdInside dans le forum Linux
    Réponses: 2
    Dernier message: 08/05/2004, 01h01
  3. [Débutant(e)] JSP utilisation static....une autre
    Par tcgenrecom dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/03/2004, 15h27
  4. Mais que fait static ???
    Par elsargento dans le forum C
    Réponses: 4
    Dernier message: 25/09/2003, 09h55
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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