Garbage Collection des champs statiques
Une question courante se pose concernant le sort des champs statiques lorsqu'ils ne sont plus référencés. Considérez la classe utilitaire suivante destinée à la configuration du programme :
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
Le champ myObject sera-t-il récupéré une fois qu'il ne sera plus utilisé, ou persistera-t-il tout au long de l'exécution du programme ?
Pour Pour répondre à cette question, nous devons comprendre la nature des variables statiques. Les variables statiques se voient allouer de la mémoire au moment du chargement de la classe et existent pendant toute la durée de vie de la classe. Le garbage collector ne peut pas les récupérer tant que la classe est chargée.
Selon la section 12.7 de la spécification du langage Java (JLS) :
A class or interface may be unloaded if and only if its defining class loader may be reclaimed by the garbage collector [...] Classes and interfaces loaded by the bootstrap loader may not be unloaded.
Par conséquent, les variables statiques dans les classes chargées ne peuvent pas être garbage collection jusqu'à ce que le chargeur de classe correspondant soit lui-même collecté. Comme les classes d'amorçage ne peuvent pas être déchargées, les variables statiques de ces classes persisteront indéfiniment.
Dans le cas de MyUtils, puisqu'il n'est pas chargé par le chargeur de classe d'amorçage, son champ statique myObject peut être récupéré une fois le programme terminé. ne nécessite plus MyUtils, qu'il soit utilisé ou non.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!