Frage:
Betrachten Sie in Java eine hypothetische Dienstprogrammklasse, die nur während verwendet wird Programm-Setup:
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
Wird myObject für die Garbage Collection geeignet sein, wenn dies nicht mehr der Fall ist? benötigt, oder bleibt es für die gesamte Programmlebensdauer bestehen?
Antwort:
Statische Felder sind nicht für die Speicherbereinigung geeignet, während ihre Klasse geladen ist. Sie können nur gesammelt werden, wenn der Klassenlader, der für das Laden dieser Klasse verantwortlich ist, selbst Garbage Collection ist.
Gemäß der Java Language Specification (JLS) Abschnitt 12.7, „Entladen von Klassen und Schnittstellen“:
"Eine Klasse oder Schnittstelle kann genau dann entladen werden, wenn ihr definierender Klassenlader vom Garbage Collector zurückgefordert werden kann [...] Von der geladene Klassen und Schnittstellen Der Bootstrap-Loader darf nicht entladen werden."
Daher bleibt myObject im bereitgestellten Beispiel bestehen, solange die Klasse MyUtils geladen ist. Es wird keine Speicherbereinigung durchgeführt, bis der Klassenlader, der MyUtils geladen hat, auch für die Speicherbereinigung geeignet ist.
Das obige ist der detaillierte Inhalt vonWird Javas Garbage Collector statische Felder wie „myObject' in „MyUtils' zurückfordern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!