Bei einer hypothetischen Utility-Klasse, die nur beim Programm-Setup verwendet wird:
class MyUtils {
private static MyObject myObject = new MyObject();
/*package*/static boolean doStuff(Params... params) {
// do stuff with myObject and params...
}
}
Wird myObject als Müll gesammelt, wenn es nicht mehr verwendet wird, oder bleibt es für die gesamte Lebensdauer des Programms erhalten?
quelle
Statische Variablen werden von Klassenobjekten referenziert, auf die von ClassLoaders verwiesen wird Vielmehr werden die Objekte, auf die sie verweisen, nicht gesammelt.
quelle
Class
Objekte, die keine statischen Variablen enthalten, von ihrem Klassenladeprogramm referenziert?Wenn Sie möchten, dass ein temporäres Objekt für die statische Initialisierung verwendet und dann entsorgt wird, können Sie einen statischen Initialisierungsblock verwenden, z
Da der statische Initialisiererblock eine spezielle statische Methode ist, ist myObject eine lokale Variable und kann nach Abschluss der Ausführung des Blocks als Müll gesammelt werden.
quelle
myObject ist eine Referenz und kein Objekt . Ein Objekt wird automatisch durch Müll gesammelt, wenn kein Verweis darauf verweist, da es nicht erreichbar ist.
So kann auch das Objekt hinter einer statischen Referenz "myObject" Müll gesammelt werden, wenn Sie es mit dereferenzieren
und es gibt keine anderen Verweise auf dieses Objekt.
Statische Referenzen und Variablen bleiben jedoch für die Lebensdauer Ihres Programms erhalten.
quelle
null
auf das Ende vonstatic block
ist eine praktikable Option. In meinem Fall musste die Lebensdauer des Objekts jedoch länger sein als der statische Block. Das Ende der Nützlichkeit des Objekts war nicht sehr konkret; daher meine frage nach der verwendung des müllsammlers.Ich denke, dies beantwortet Ihre Frage - im Grunde nicht, es sei denn, die Klasse stammt von einem speziellen Klassenlader und entlädt die Klasse.
quelle
Der Schlüssel hier ist die Garbage Collection von Klasseninstanzen, dh Objekte. Die ClassLoader-Instanz ist im Wesentlichen ein Objekt. Wenn das Classloader-Objekt also nicht müllsammelbar ist, werden alle im Heap gespeicherten Referenzen (dh statische Daten) fast nie müllsammelbar sein. Die Ausnahme ist der String-Pool.
Bevor Sie sich plötzlich dazu entschließen, überlegen
private static MyGiantClass myGiantObject = new MyGiantClass()
Sie zweimal, wie ich es auf die harte Tour gelernt habe.quelle