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

Étant donné une classe utilitaire 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é quand il ne sera plus utilisé ou restra-t-il pendant toute la durée du programme?

    Les variables statiques ne peuvent pas être choisies pour le nettoyage de la mémoire pendant le chargement de la classe. Ils peuvent être collectés lorsque le chargeur de classe respectif (responsable du chargement de cette classe) est lui-même collecté pour les déchets.

    Consultez la section 12.7 de JLS Déchargement des classes et des interfaces

    Une classe ou une interface peut être déchargée si et seulement si son chargeur de classe définissant peut être récupéré par le garbage collector […] Les classes et interfaces chargées par le chargeur de bootstrap peuvent ne pas être déchargées.

    Les variables statiques sont référencées par des objects Class référencés par ClassLoaders -si sauf que ClassLoader supprime la classe d’une manière ou d’une autre (si c’est même possible) ou que ClassLoader lui-même devient éligible pour la collecte plutôt, les objects auxquels ils font référence ne seront pas collectés.

    Si vous souhaitez qu’un object temporaire soit utilisé pour l’initialisation statique, 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 un type spécial de méthode statique, myObject est une variable locale et peut être nettoyé une fois l’exécution du bloc terminée.

    myObject est une référence et non un object . Un object est automatiquement récupéré lorsque aucune référence ne lui est associée, car il est inaccessible.

    Ainsi, l’object derrière une référence statique “myObject” peut être récupéré si vous le déréférenciez avec

     myObject = null; 

    et il n’y a pas d’autres références à cet object.

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

    Je pense que cela répond à votre question – fondamentalement pas à moins que la classe ne vienne d’un chargeur de classe spécial et que cela décharge la classe.

    La clé ici est la collecte des ordures de la classe, c’est-à-dire les objects. L’instance de ClassLoader est essentiellement un object. Donc, si l’object Classloader n’est pas récupéré, toutes les références stockées dans heap (c’est-à-dire des éléments statiques) ne seront presque jamais récupérées. L’exception est le pool de chaînes.

    Donc, avant que vous ne décidiez soudainement de faire de private static MyGiantClass myGiantObject = new MyGiantClass() réfléchissez-y à deux fois.