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

Agents de placement/Fenêtres Java Discussion :

JFrame et GarbageCollector


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut JFrame et GarbageCollector
    Bonjour,

    J'ai juste une petite interrogation par rapport aux JFrame :

    Mettons que je fasse un setVisible(false) sur une JFrame, puis que celle-ci ne soit plus référencée, càd qqc comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JFrame f = new JFrame();
    ...
    f.setVisible(false);
    f = null;
    en gros.

    Est-ce que la JFrame sera garbage collectée ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Comme tout objet java, il est nettoyable par le GC dès qu'il n'y a plus de référence qui permette de l'atteindre. Donc en gros, quand il n'est plus à l'écran et que ton code n'y fait plus référence.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Ok.

    Je me posais la question parce qu'une fenêtre non référencée mais visible ne sera pas garbage collectée (fort heureusement)...

    Merci pour tes explications.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Comme tout objet java, il est nettoyable par le GC dès qu'il n'y a plus de référence qui permette de l'atteindre. Donc en gros, quand il n'est plus à l'écran et que ton code n'y fait plus référence.
    Salut,

    je pensais qu'il fallait faire un dispose() pour ça (qu'un setVisible(false) n'était pas suffisant que toutes les références internes à SWING sur la JFrame soient supprimées)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Euh... Conclusion ?

  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 Sharcoux Voir le message
    Je me posais la question parce qu'une fenêtre non référencée mais visible ne sera pas garbage collectée (fort heureusement)...
    En fait il existe toujours une référence vers une fenêtre visible...

    Citation Envoyé par joel.drigo Voir le message
    je pensais qu'il fallait faire un dispose() pour ça (qu'un setVisible(false) n'était pas suffisant que toutes les références internes à SWING sur la JFrame soient supprimées)
    Il faut bien appeler dispose() pour complètement libérer les ressources utilisées par la fenêtre.
    Mais il ne s'agit pas de ressources géré par le Garbage Collector, mais de ressource système.


    a++

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il faut bien appeler dispose() pour complètement libérer les ressources utilisées par la fenêtre.
    Mais il ne s'agit pas de ressources géré par le Garbage Collector, mais de ressource système.
    Ca c'est ce que dit clairement la doc. En revanche, ce qui est moins clair, c'est si un setVisible(false) est invoqué et que le code appelant n'a plus de référence sur la frame, c'est qu'elle puisse être "garbagée" (j'entends par là "éligible comme libérable par le Garbage Collector") dans ce cas : ce qui signifie qu'on pourrait permettre de libérer une frame dont les ressources système associées non pas été libérées.
    C'est juste pour comprendre et savoir... dans l'absolu, à mon avis, il ne faut jamais perdre une référence sur une jframe sans l'avoir disposée, ou s'être arranger pour qu'elle le soit, par un frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) par exemple. Un appel à setVisible(false) n'étant nécessaire que si on veut pourvoir réafficher la jframe.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le dispoe set si tu veux libérer les ressources système tout en gardant une référence vers ta fenêtre. Par exemple, tu as une fenêtre avec beaucoup d'images / icones, etc, mais tu ne l'affiche que de temps e temps. Entre deux, tu peux faire un dispose(), le prochain appel à setVisible(true) recréera les ressources système.

    Oui, une fenetre non visible où dispose() n'a pas été appelé et pour laquelle le GC peux la collecter libèrera ses ressources système lors du passage du gc. dispose() permet juste de le faire plus tôt.


    Conclusion: une JFrame au niveau du GC se comportent comme n'importe quel autre objet. Il faut juste faire attention qu'en interface graphique, on oublie vite une référence à gauche ou à droite. Par exemple , on oublie vite que la fenetre visible et inévitablement enregistrée dans l'event dispatcher

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Désolé, je vous ai perdu...

    Si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    JFame f = new JFrame();
    f.setVisible(true);
    ...
    //2-3 traitements sans conséquences
    ...
    f.setVisible(false);
    f = null;
    J'aurai donc le même résultat après passage du GC que si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    JFame f = new JFrame();
    f.setVisible(true);
    ...
    //2-3 traitements sans conséquences
    ...
    f.dispose();
    J'ai bien compris ?

    Je pose la question parce que je suis en face d'un code que je n'ai pas écrit et qui n'utilise que des f.setVisible(false) à la place de dispose() et que je me demande si ça peut finir par créer un problèmes.

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    le dispoe set si tu veux libérer les ressources système tout en gardant une référence vers ta fenêtre. Par exemple, tu as une fenêtre avec beaucoup d'images / icones, etc, mais tu ne l'affiche que de temps e temps. Entre deux, tu peux faire un dispose(), le prochain appel à setVisible(true) recréera les ressources système.

    Oui, une fenetre non visible où dispose() n'a pas été appelé et pour laquelle le GC peux la collecter libèrera ses ressources système lors du passage du gc. dispose() permet juste de le faire plus tôt.


    Conclusion: une JFrame au niveau du GC se comportent comme n'importe quel autre objet. Il faut juste faire attention qu'en interface graphique, on oublie vite une référence à gauche ou à droite. Par exemple , on oublie vite que la fenetre visible et inévitablement enregistrée dans l'event dispatcher
    Ok ! Merci Moi qui avait toujours compris l'inverse :o Surtout que je bosse surtout en SWT que pour le coup c'est carrément l'inverse... le dispose est obligatoire parce que le setVisible(false) va en effet permettre au shell d'être supprimé de la mémoire sans que le handle système ne soit libéré
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Sharcoux Voir le message

    J'ai bien compris ?
    Non, du tout, ça n'a rien à voir. Le dispose libère les ressources système, ce qui n'influence pas le GC

  12. #12
    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
    Citation Envoyé par tchize_ Voir le message
    Oui, une fenetre non visible où dispose() n'a pas été appelé et pour laquelle le GC peux la collecter libèrera ses ressources système lors du passage du gc. dispose() permet juste de le faire plus tôt.
    Je ne suis pas sûr de cela.

    Tant que la fenêtre n'a pas été disposée, elle reste référencée via le framework Swing (via Window.getWindow()) car elle peut comporter des ressources non-géré par le GC (lié à l'écran ou autre).

    Le GC ne peut s'occuper que de ce qui touche la mémoire. rien de plus.
    Là on parle de ressources géré par le système d'exploitation hôte (les fenêtres), ce qui est en dehors des capacités du GC.


    a++

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je suis tombé il y a deux jours sur un bug report qui datait de l'époque sun, où il était indiqué qu'en faisant ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i=0; i< 10; i++){
       MaFrame f = new MaFrame();
       f.setVisible(true);
       thread.sleep(1000);
       f.setVisible(false); // enfin c'était dans swingutilities, je simplifie
    }
    On constatait que certains fenêtres n'étaient pas GC (pas d'appel à la méthode finalize()) => sun avait reconnu le bug, donc oui, selon moi, le dispose n'est pas nécessaire pour que la fenetre soit GC. Je ne trouve pas de doc qui prétende le contraire chez oracle. Il n'est fait mention nulle part du GC dans dispose(), par exemple.

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Non, du tout, ça n'a rien à voir. Le dispose libère les ressources système, ce qui n'influence pas le GC
    Ben... Si le dispose() libère les ressources, ça veut dire que le GC n'aura pas à le faire, non ? Enfin, je dis ça parce que pour moi le rôle du GC c'est de libérer les ressources qui ne risquent plus de servir. Mais j'ai peut-être mal compris là aussi... Ou j'ai mal compris ta remarque... Ou les deux...

  15. #15
    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
    Citation Envoyé par tchize_ Voir le message
    je suis tombé il y a deux jours sur un bug report qui datait de l'époque sun,
    Attention aux vieux bugs qui ne représentent pas forcément le fonctionnement des versions plus récentes.

    Par exemple jusqu'à Java 5 on peut voir que les JFrames utilisaient le système de finalisation.
    Toutefois c'est à la fois très contraignant et très dangereux à utiliser, et depuis Java 6 il n'y a plus rien de tel.
    On peut le voir via la javadoc, dans la version 5 finalize() était redéfinie dans Frame, alors que ce n'est plus le cas désormais :
    http://docs.oracle.com/javase/1.5.0/...ng/JFrame.html
    http://docs.oracle.com/javase/6/docs...ng/JFrame.html


    Pour moi il faut donc appeler explicitement dispose() ou utiliser DISPOSE_ON_CLOSE...



    Citation Envoyé par Sharcoux Voir le message
    Ben... Si le dispose() libère les ressources, ça veut dire que le GC n'aura pas à le faire, non ? Enfin, je dis ça parce que pour moi le rôle du GC c'est de libérer les ressources qui ne risquent plus de servir. Mais j'ai peut-être mal compris là aussi... Ou j'ai mal compris ta remarque... Ou les deux...
    Le GC libère UNIQUEMENT la mémoire utilisé par les objets Java.
    Mais ce n'est pas la seule ressource qui peut être utilisé par un programme !

    Les JFrames utilisent d'autres types de ressources lié à l'environnement graphique du système hôte.
    Ces ressources ne sont pas donc gérées par le GC, et doivent donc être libéré explicitement, d'où l'intérêt du dispose().


    a++

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    @adiGuba : Merci pour les précisions sur le GC.

    Pour ma part, je ne sais pas qui de vous à raison au final, mais moi je vais mettre des dispose() partout, dans le doute...

    En tout cas, merci beaucoup pour votre investissement, et si la question vous intéresse toujours, je serai curieux de continuer à lire vos points de vue sur la question.

    Merci encore.

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ce n'est pas parce qu'il n'y a plus de finalizer dans la jframe qu'elle ne libère plus ses ressources. La frame est référencée dans de nombreuses weakreferences. Hors on peut aussi faire du boulot de nettoyage via ces weakreferences. Je reste d'avis: sans un document me disant que le dispose est nécessaire, que le GC ne suffit pas, pour moi, ça relève juste de la légende urbaine

  18. #18
    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
    Citation Envoyé par tchize_ Voir le message
    ce n'est pas parce qu'il n'y a plus de finalizer dans la jframe qu'elle ne libère plus ses ressources. La frame est référencée dans de nombreuses weakreferences. Hors on peut aussi faire du boulot de nettoyage via ces weakreferences. Je reste d'avis: sans un document me disant que le dispose est nécessaire, que le GC ne suffit pas, pour moi, ça relève juste de la légende urbaine
    Et je te dirais l'inverse : sans un document me disant que le dispose est inutile, je continuerais de le recommander. Et croire que le GC s'en occupe relève de la légende urbaine

    Le GC s'occupe d'une seule et unique ressource : la mémoire occupé par les objets Java.

    Tous les autres types de ressources doivent être libérés explicitement.
    Et généralement le fait d'utiliser le GC pour gérer autre chose est une mauvaise idée...


    a++

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

Discussions similaires

  1. Appelant de jFrame
    Par OSboots dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 16/05/2004, 18h47
  2. [JFrame][JScrollPane] rafraichissement
    Par iuz dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 14/05/2004, 12h08
  3. [JDialog] JDialog ou JFrame ?
    Par Mister Nono dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 25/04/2004, 22h55
  4. Comment mettre une image en fond de JFrame
    Par marc26 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/01/2004, 18h57
  5. Faire une JFrame avec LookAndFeel
    Par aburner dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/12/2003, 09h54

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