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 :

Libération objet complexe


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 194
    Par défaut Libération objet complexe
    Dans mon application, je créé des objets "complexes" qui maintiennent ouvertes entre autres des connexions à des sockets. Je ne souhaite pas conserver ces connexion ouvertes durant toute la durée de la vie de l'application (qui peut être très longue) et je souhaiterais donc les fermer lorsque l'objet en question n'est plus utilisé. Or je ne peux pas connaitre à l'avance la durée de vie de mon objet. J'ai encapsulé mon objet dans une WeakReference afin qu'il soit nettoyé lorsqu'il n'est plus référencé mais j'aimerais être "notifié" à la destruction de l'objet pour piuvoir faire les nettoyages nécessaire et en particulier fermer les connexions.
    Je sais qu'il n'est pas conseillé de surcharger la méthode finalize et j'ai sait également qu'il existe les PhantomReference qui permette ce genre de choses mais :
    1- Peut on combiner Phantom et Weak reference ?
    2- Je n'ai pas réussit à faire fonctionner les PhantomReference pour être systématiquement notifié à la destruction.

    Quelqu'un aurait-il un cas d'utilisation pratique à me fournir ?

  2. #2
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    Une idée serait peut-être de gérer ta connexion dans un singleton et de l'associer à tes objets complexes. En suite de gérer l'ouverture et la fermeture des connexions au plus près des besoins, de fermer dès que chaque opération unitaire est réalisée et de rouvrir pour refaire un appel.
    De toute les façon le serveur va fermer ses connexions au bout d'un certain temps d'inactivité. Le risque est que ton objet complexe se "réveil" pour faire une action et que sa connexion soit déjà fermer par le serveur.
    A moins que tu es un besoin particulier du genre reverse ajax...

  3. #3
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Si tu as déjà des WeakReference, ce n'est pas forcément la peine d'aller plus loin avec des PhantomReference. Il suffirait d'utiliser une ReferenceQueue à passer paramètre du constructeur de la référence. Et lorsque la méthode remove() de la queue retourne une référence alors tu peux fermer la connexion correspondante.

    Attention quand même, avec une WeakReference, tu dépends du garbage collector et tu n'as jamais de garantie sur le moment où il décidera qu'il peut "nettoyer" cette référence.

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Utilisez une ReferenceQueue ou surcharger finalize ça revient à peu de choses près au même.

    Sauf que :
    • finalize() est appelée quand l'objet est vraiment libéré
    • La reference queue est notifiée quand la reference detecte la perte et non sur la libration de l'objet. Par exemple pour une WeakReference, il peut y avoir des PhantomReference qui maintienne toujours l'objet en mémoire.
    • Quand la reference queue est notifiée, tu as perdu l'objet


    Dans un premier temps, j'écrirais une méthode stop/shutdown/clean qui fais le ménage proprement (ne le fais pas s'il est déjà fait). Je redéfinirai "finalize()" afin qu'il fasse le appel à cette méthode.

    Dans un second temps je reverrai mon architecture pour être notifié du moment où le service doit être arrêté.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    L’intérêt de close est d'optimiser la gestion des ressources par rapport au garbage. Si tu perds la référence de ton objet complexe (la chaine de strong référence est brisée), que la soket est uniquement référencée par cet objet, et que le garbage passe, le garbage va ramesser ta socket. Si c'est l'implémentation standard, ne t'inquiète pas tout est gérer.
    Les weakreference c'est pour éviter de créer une chaine de strong références et ainsi garder un référence "weak" tout en permettant au garbage de détruire tes objets.
    Si tes sockets sont partagées entre tes objets complexes, que tu multi thread alors je dirais qu'il vaut mieux créer un pool de socket, ça sera le plus économique q'une socket par objet complexe. Sinon une socket pour tous tes objets...

  6. #6
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Citation Envoyé par Nemek Voir le message
    finalize() est appelée quand l'objet est vraiment libéré
    Et on ne contrôle pas le thread dans lequel finalize() est appelé, ce qui peut être parfois gênant selon ce qu'on y fait. En plus on peut toujours ressusciter l'objet dans le finalize().

    Citation Envoyé par Nemek Voir le message
    La reference queue est notifiée quand la reference detecte la perte et non sur la libration de l'objet. Par exemple pour une WeakReference, il peut y avoir des PhantomReference qui maintienne toujours l'objet en mémoire.
    Oui mais on ne peut pas accéder à l'objet via une PhantomReference donc il n'y a pas de raison qu'il soit utilisé par le programme.

  7. #7
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par -gma- Voir le message
    Et on ne contrôle pas le thread dans lequel finalize() est appelé, ce qui peut être parfois gênant selon ce qu'on y fait. En plus on peut toujours ressusciter l'objet dans le finalize().
    Je mettrais ma main à couper qu'il s'agit de Finalizer mais je peux me tromper.

    Citation Envoyé par -gma- Voir le message
    Oui mais on ne peut pas accéder à l'objet via une PhantomReference donc il n'y a pas de raison qu'il soit utilisé par le programme.
    Phantom references are most often used for scheduling pre-mortem cleanup actions
    source
    Dans ce cas, les PhantomReference sont plus appropriées.
    D'une manière comme d'une autre les informations ne sont plus accessibles alors je vois pas ce que tu pourrais y faire.
    Sauf si tu stockes toutes les informations dans une IdentityHashMap sur la référence (Phantom ou Weak).

    De toutes façons l'idéal reste de gérer proprement ses ressources : les nettoyer dès qu'on en a plus besoin.
    Car le principe du général du GC, c'est qu'il fait le ménage quand la JVM a besoin de mémoire.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. Garbage Collector/libération objets référencés
    Par LeSmurf dans le forum Général Java
    Réponses: 3
    Dernier message: 17/12/2006, 19h47
  2. Stockage d'objet complexe
    Par cathar_rhythm dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 18/10/2005, 14h09
  3. Travailler / Créer des objets complexes
    Par Ekinoks dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/08/2005, 14h38
  4. texture sous opengl : objets complexes
    Par pouleriguen dans le forum OpenGL
    Réponses: 1
    Dernier message: 20/11/2004, 19h47
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

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