Étant donné une classe d'utilité 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...
}
}
myObject sera-t-il récupéré lorsqu'il n'est plus utilisé ou restera-t-il pendant toute la durée de vie du programme?
la source
Les variables statiques sont référencées par des objets Class qui sont référencés par ClassLoaders -so à moins que le ClassLoader ne supprime la classe d'une manière ou d'une autre (si cela est même possible) ou que le ClassLoader lui-même devienne éligible pour la collection (plus probablement - pensez à décharger les applications Web) les variables statiques (ou les objets auxquels ils font référence) ne seront pas collectés.
la source
Class
objets qui ne contiennent aucune variable statique sont-ils référencés par leur chargeur de classe?Si vous voulez qu'un objet temporaire soit utilisé pour l'initialisation statique puis éliminé, vous pouvez utiliser un bloc d'initialisation statique, par exemple
puisque le bloc d'initialisation 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.
la source
myObject est une référence et non un objet . Un objet est automatiquement garbage collection lorsqu'aucune référence ne pointe vers lui car il est inaccessible.
Ainsi, l'objet derrière une référence statique "myObject" peut également être récupéré si vous le déréférencer avec
et il n'y a aucune autre référence à cet objet.
Cependant, les références et variables statiques restent pour la durée de vie de votre programme.
la source
null
à la fin destatic block
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; donc ma question sur l'utilisation du ramasse-miettes.Je pense que cela répond à votre question - en gros pas à moins que la classe ne vienne d'un chargeur de classe spécial et que cela décharge la classe.
la source
La clé ici est la récupération de place des instances de classe, c'est-à-dire des objets. L'instance ClassLoader est, par essence, un objet. Donc, si l'objet Classloader n'est pas garbage collection, toute référence d'entre eux stockée dans le tas (c'est-à-dire des éléments statiques) ne sera presque jamais garbage collect. L'exception est le pool de chaînes.
Alors avant de vous décider soudainement de faire
private static MyGiantClass myGiantObject = new MyGiantClass()
Réfléchissez à deux fois, car j'ai appris à la dure.la source