97 votes

Les champs statiques sont-ils ouverts à la collecte des déchets ?

Étant donné une classe utilitaire hypothétique qui n'est utilisée que dans la configuration du programme :

class MyUtils {
   private static MyObject myObject = new MyObject();
   /*package*/static boolean doStuff(Params... params) {
       // do stuff with myObject and params...
   }
}

Est-ce que myObject sera collecté par le ramasse-miettes une fois qu'il ne sera plus utilisé, ou restera-t-il en mémoire pendant toute la durée du programme?

115voto

bruno conde Points 28120

Les variables statiques ne peuvent pas être sélectionnées pour la collecte des déchets tant que la classe est chargée. Elles peuvent être collectées lorsque le chargeur de classe respectif (qui était responsable du chargement de cette classe) est lui-même collecté pour les déchets.

Consultez la Section 12.7 du JLS Déchargement des classes et interfaces

Une classe ou une interface peut être déchargée si et seulement si sa classe de définition chargeur peut être réclamé par le ramasse-miettes collecteur [...] Les classes et interfaces chargées par le chargeur d'amorçage ne peuvent pas être déchargées.

0 votes

@bruno, Selon votre lien, cela signifie-t-il qu'un class loader conserve une référence à chaque classe qu'il charge, même si la classe chargée n'a pas de membres statiques?

0 votes

@brunoconde, Je ne pense pas que ce soit vrai en fait. Quel paragraphe le dit exactement? (Veuillez poursuivre la discussion sur stackoverflow.com/questions/405364/…)

1 votes

Quand le chargeur de classes serait admissible à la collecte des déchets. ?

57voto

Jon Skeet Points 692016

Les variables statiques sont référencées par des objets de classe qui sont référencés par des classloaders - donc à moins que le classloader ne supprime d'une manière ou d'une autre la classe (si c'est même possible) ou que le classloader lui-même devienne éligible pour la collecte (plus probable - pensez au déchargement des applications web), les variables statiques (ou plutôt, les objets auxquels elles font référence) ne seront pas collectées.

1 votes

Les objets de Class qui ne contiennent pas de variables statiques sont-ils référencés par leur chargeur de classe ?

14voto

finnw Points 24592

Si vous voulez qu'un objet temporaire soit utilisé pour une initialisation statique puis jeté, vous pouvez utiliser un bloc d'initialisation statique, par exemple :

class MyUtils {
   static
   {
      MyObject myObject = new MyObject();
      doStuff(myObject, params);
   }

   static boolean doStuff(MyObject myObject, Params... params) {
       // do stuff with myObject and params...
   }
}

comme le bloc d'initialisation statique est une sorte spéciale de méthode statique, myObject est une variable locale et peut être ramassée par le garbage collector une fois que le bloc a fini d'exécuter.

14voto

cellz Points 56

MyObject est une référence et non un objet. Un objet est automatiquement collecté par le ramasse-miettes (garbage collector) lorsqu'aucune référence ne pointe vers lui car il est inatteignable.

Ainsi, l'objet derrière une référence statique "myObject" peut également être collecté par le ramasse-miettes si vous le supprimez avec

myObject = null;

et s'il n'y a pas d'autres références vers cet objet.

Cependant, les références statiques et les variables restent en mémoire pour la durée de vie de votre programme.

0 votes

Bienvenue sur StackOverflow! Définir l'objet sur null à la fin du bloc statique est une option viable. Dans mon cas, cependant, la durée de vie de l'objet devait être plus longue que le bloc statique. La fin d'utilité de l'objet n'était pas très concrète; d'où ma demande concernant l'utilisation du ramasse-miettes.

7voto

Tom Points 13036

Je pense que ceci répond à votre question - en gros, pas à moins que la classe ne provienne d'un chargeur de classe spécial et qu'elle décharge la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X