Angenommen, eine Instanz von MyClass ist nicht auf eine andere Art und Weise verwurzelt, wird die private statische Referenz hier verhindern, dass sie als Garbage Collection erfasst wird?Kann eine Klasse, die sich selbst in einem statischen Feld referenziert, Müll gesammelt werden?
Antwort
Die von Ihnen gepostete Klasse wird nicht als Müll gesammelt. Sie können dies testen, indem es einen Finalizer mit einer Konsolenausgabe geben:
public class MyClass
{
private static MyClass heldInstance;
public MyClass()
{
heldInstance = this;
}
~MyClass()
{
Console.WriteLine("Finalizer called");
}
}
class Program
{
static void Main(string[] args)
{
var x = new MyClass(); // object created
x = null; // object may be eliglible for garbage collection now
// theoretically, a GC could happen here, but probably not, with this little memory used
System.Threading.Thread.Sleep(5000);
// so we force a GC. Now all eligible objects will definitely be collected
GC.Collect(2,GCCollectionMode.Forced);
//however their finalizers will execute in a separate thread, so we wait for them to finish
GC.WaitForPendingFinalizers();
System.Threading.Thread.Sleep(5000);
Console.WriteLine("END");
}
}
Der Ausgang wird sein:
END
Finalizer called
Was bedeutet, dass die Klasse erst in dem letzten Abrüsten der Anwendung gesammelt wird, nicht während einer normalen Speicherbereinigung.
Wenn Sie mehrere Instanzen dieser Klasse wie folgt zu erstellen:
var x = new MyClass();
x = new MyClass();
x = new MyClass();
x = new MyClass();
dann alle außer der jüngsten wird Müll gesammelt werden.
Sie würden
Finalizer called
Finalizer called
Finalizer called
END
Finalizer called
Beachten Sie, dass dies nur gilt, weil 'heldInstance' statisch ist. Es ist nichts Besonderes an der Tatsache, dass eine Instanz von 'MyClass' einen Verweis auf sich selbst hat. Also, ja "eine Klasse, die sich selbst bezeichnet" kann Müll gesammelt werden. Die Klasse im Beispiel kann dies jedoch nicht. – dgvid
Der Garbage Collector bekommen bestimmt, welche Objekte erreichbar sind und diejenigen sammeln, die es nicht sind. Um festzustellen, ob ein Objekt erreichbar ist, beginnt der Kollektor mit den so genannten Wurzeln. Unter den Wurzeln sind die Dinge, die derzeit auf dem Auswertungsstapel sind, aber auch statische Felder. Der Kollektor folgt den Verweisen auf Objekte von den Wurzeln zu einem beliebigen Objekt und von einem solchen Objekt zu einem anderen Objekt und so weiter. Jedes Objekt, das auf diese Weise besucht wurde, ist erreichbar und wird daher am Leben erhalten.
In Ihrem Fall ist das statische Feld einer der Wurzeln des Garbage Collectors, und deshalb wird es nie irgendein Objekt sammeln, das (indirekt) von diesem Feld referenziert wird. Wenn Sie jedoch das Feld auf null
festlegen, verweist dieses Feld nicht mehr auf die Instanz und die Instanz kann gesammelt werden.
- 1. Instanzen, die nur von 'bound_this' referenziert werden, werden nicht als Müll gesammelt
- 2. Können Timer automatisch Müll gesammelt werden?
- 3. Wie Erlang Atome Müll gesammelt werden können
- 4. Protokollierung, wenn Objekte Müll gesammelt werden
- 5. Picasso Ziel wurde Müll gesammelt
- 6. Warum wird dieser Müll gesammelt?
- 7. Großer Speicherbrocken nicht Müll gesammelt
- 8. Nicht statisches Feld kann nicht aus einem statischen Kontext referenziert werden
- 9. Service wird nie Müll gesammelt
- 10. Delegierten nicht bekommen Müll gesammelt
- 11. Wird Objective-C auf Linux-Müll gesammelt?
- 12. Seite, die sich selbst in HTML iframe referenziert
- 13. Müll gesammelt Cache über Javascript WeakMaps
- 14. Warum werden Silverlight ContentControls nicht als Müll gesammelt?
- 15. Java Thread Müll gesammelt oder nicht
- 16. Was passiert, wenn eine Scala "Future" Müll gesammelt wird?
- 17. Kann eine Klasse eine Referenzvariable für sich selbst enthalten?
- 18. Ermitteln, ob ein Objekt Müll gesammelt wurde
- 19. Initialisierung der statischen Variablen mit sich selbst
- 20. Kann eine C++ - Klasse sich selbst als Mitglied enthalten?
- 21. Wie kann ich einen bestimmten Agenten in Clojure stoppen? Wann werden ihre Staaten Müll gesammelt?
- 22. "Nicht statische Variable, die nicht aus einem statischen Kontext referenziert werden kann" beim Erstellen eines Objekts
- 23. assoziieren Modell zu sich selbst mit einem Feld in CakePHP
- 24. Kann eine Klasseninstanz sich selbst zerstören?
- 25. In Java wird Permanent Generation Speicherplatz Müll gesammelt?
- 26. Java nicht statische Methode playCompletely kann nicht aus einem statischen Kontext referenziert werden
- 27. Wenn Spocks @ Shared-Annotation einem statischen Feld vorgezogen werden sollte?
- 28. nicht-statische Klasse kann nicht von einem statischen Kontext
- 29. Schreibeinheitstests für eine Klasse, die Benutzeroberflächensteuerelemente referenziert
- 30. Wie deklariere ich einen Typedef, der sich selbst referenziert?
mögliche Duplikate von [Werden statische Mitglieder jemals Müll gesammelt?] (Http://stackoverflow.com/questions/6600093/do-static-members-ever-get-garbage-collected) EDIT: Kurz gesagt, nein, Ich glaube nicht, dass es so sein wird. Zum Beispiel gibt es im Code, den Sie gepostet haben, keinen Grund, warum der öffentliche Konstruktor nicht hätte haben können: if (heldInstance == null) Andere als die _instances_, in denen die einzigen gehaltenen Referenzen von sich selbst _eventually_ gesammelt werden wenn der GC feststellt, dass er nicht mehr zugänglich ist. –
Ja, sie werden gesammelt, kurz bevor die AppDomain entladen wird. Das ist belanglos, es sei denn, die Klasse hat einen Finalizer. –
Die Tatsache, dass ein statisches Feld der Klasse auf eine Instanz * der gleichen Klasse * verweist, ist irrelevant. Statische Felder sind Wurzeln; Sie werden alles am Leben halten, was Sie unabhängig von ihrem Typ in sie stecken. –