Question :
En Java, considérons une classe utilitaire hypothétique qui n'est utilisée que pendant configuration du programme :
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
MonObjet sera-t-il éligible à la collecte des ordures lorsqu'il ne l'est plus est-il nécessaire, ou persistera-t-il pendant toute la durée de vie du programme ?
Réponse :
Les champs statiques ne sont pas éligibles au garbage collection pendant que leur classe est chargée. Ils ne peuvent être collectés que lorsque le chargeur de classe responsable du chargement de cette classe est lui-même récupéré.
Selon la section 12.7 de la spécification du langage Java (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 [...] Classes et interfaces chargées par le bootstrap Le chargeur ne peut pas être déchargé."
Par conséquent, dans l'exemple fourni, myObject persistera tant que la classe MyUtils est chargée. Il ne sera pas récupéré tant que le chargeur de classe qui a chargé MyUtils n'est pas également éligible pour le garbage collection.
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!