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

avec Java Discussion :

Variable globale ou locale et garbage collector


Sujet :

avec Java

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut Variable globale ou locale et garbage collector
    Bonjour,

    Dans mon programme il y a la structure suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class test {
        private JButton button;
     
        public test() {
            button = new JButton ("Text")
        }
    }
    Il me semble que dans ce cas, toutes les variables sont globales et qu'elles ne peuvent pas être "gabage collectée". Qu'en est-il aussi des classes d'événement et des composants ajoutés aux fenêtres. Sont-il candidats au garbage collector ?

    Comment optimiser l'utilisation mémoire d'autant que suivant la JVM, l'allocation en mémoire est limitée comme sur Mac OS 7, 8 et 9 pour ceux qui connaissent.

    Merci d'avance pour votre aide.
    Battant

  2. #2
    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
    Salut,

    Il n'y a pas de notions de variable globale en Java. La variable button dans ton code est une variable de classe, donc visible dans toutes les méthodes et instances de classes internes, ou anonymes locales. Si une variable est déclarée dans un bloc, elle est locale au bloc. De même, si une variable est déclarée dans une méthode, elle est locale à la méthode (au bloc de la méthode). Une variable peut-aussi être static : dans ce cas, elle est partagée entre toutes les instances.

    Ce ne sont pas les variables qui sont éligibles au garbage collector, mais les instances de classe. Une variable stocke une référence vers une instance. Lorsqu'il n'existe plus aucune variable qui référence une instance, cette instance devient éligible. L'instance de JButton mise dans la variable button sera éligible lorsque plus aucune instance de classe ou bloc de méthode n'aura de référence dessus.

    A noter qu'une variable déclarée final dans un bloc peut être utilisée dans un bloc d'une classe anonyme déclarée dans le bloc (ou un sous-bloc) : dans ce cas, la classe anonyme possède la référence de l'instance référencée par la variable final. Mais c'est la même chose quand une instance est créée dans une instance de classe, puis transmise à une autre instance (de la même classe ou d'une autre) : la première instance perd la référence, mais la seconde la prend, donc l'instance n'est pas éligible. Ceci montre bien que ce ne sont pas là où on déclare les variables qui compte, mais ce qu'on fait des références d'instances et dans quelles variables on les stocke.
    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.

  3. #3
    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 joel.drigo Voir le message
    Lorsqu'il n'existe plus aucune variable qui référence une instance, cette instance devient éligible. L'instance de JButton mise dans la variable button sera éligible lorsque plus aucune instance de classe ou bloc de méthode n'aura de référence dessus.
    Désolé Joel, mais je me dois de préciser. Avec ce genre de phrase on retrouve des débutants qui mettent tout à null en espérant que ça change quelque chose

    La phrase plus ou moins correcte est "lorsqu'il n'existe plus aucun chemin de références permettant d'atteindre cette instance, alors elle deviens eligible au garbage collection". Qu'il y aie ou non des variables qui la référence n'y change rien. Le terme officiel est plus alambiqué, mais c'est suffisant pour un débutant. Autrement dit, si il ne t'es plus possible, toi, dans le code, même pas un moyen tordu, d'atteindre cette référence, alors on peux la jeter puisque tu ne t'en servira plus.


    Attention qu'il y a une subtilité avec les interfaces graphiques. Tant que ton instance de fenêtre est visible ou qu'elle est invisible mais que tu n'a pas appelé dispose() dessus, elle ne peut pas être éligible au garbage collector car le système d'affichage maintient toujours une référence vers cette fenêtre. Il en va par conséquence de même pour tout ce qui se trouve dedans.

  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
    Désolé Joel, mais je me dois de préciser. Avec ce genre de phrase on retrouve des débutants qui mettent tout à null en espérant que ça change quelque chose
    La précision était utile en effet.
    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.

Discussions similaires

  1. Variable globale et locale
    Par Super_carotte dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 17/05/2010, 13h58
  2. variables globales et locales
    Par une_tite_question dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 25/06/2008, 18h32
  3. Variable globale et locale
    Par momo70 dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/07/2007, 09h49
  4. variables globales ou locales
    Par exhortae dans le forum C
    Réponses: 6
    Dernier message: 09/04/2007, 01h29
  5. variable globale ou locale pour CurrentDB
    Par jibouze dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/05/2006, 17h15

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