web-dev-qa-db-fra.com

Les champs statiques sont-ils ouverts pour la récupération de place?

Étant donné une classe d'utilité hypothétique utilisée uniquement 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...
   }
}

myObject sera-t-il récupéré lorsqu'il ne sera plus utilisé ou restera-t-il en place pendant toute la durée du programme?

80
Michael Deardeuff

Les variables statiques ne peuvent pas être choisies pour la récupération de place lorsque la classe est chargée. Ils peuvent être collectés lorsque le chargeur de classe correspondant (chargé du chargement de cette classe) est lui-même collecté pour les déchets.

Consultez le JLS Section 12.7 Déchargement de classes et d’interfaces

Une classe ou une interface peut être déchargée si et seulement si c'est sa classe de définition le chargeur peut être récupéré à la poubelle collecteur [...] Classes et interfaces chargé par le chargeur d’amorçage ne peut pas être déchargé.

101
bruno conde

Les variables statiques sont référencées par des objets Class référencés par ClassLoaders. Ainsi, à moins que le ClassLoader ne supprime pas la classe (si cela est possible) ou que le ClassLoader lui-même devienne éligible pour la collecte les objets auxquels ils font référence) ne seront pas collectés.

45
Jon Skeet

Si vous souhaitez qu'un objet temporaire soit utilisé pour l'initialisation statique, puis supprimé, vous pouvez utiliser un bloc initialiseur 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...
   }
}

Étant donné que le bloc initialiseur statique est un type spécial de méthode statique, myObject est une variable locale et peut être récupéré après l'exécution du bloc.

13
finnw

myObject est un reference et non un object . Un objet est automatiquement récupéré quand aucune référence ne le pointe car il est inaccessible.

De même, l’objet derrière une référence statique "myObject" peut être récupéré si vous le déréférence avec

myObject = null;

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

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

9
Felix Keil

Je pense ceci répond à votre question - fondamentalement, à moins que la classe ne vienne d’un chargeur de classe spécial et qu’elle décharge la classe.

6
Tom