Ist es möglich, dass Readonly Modifier Einfluss auf Garbage Collector Arbeit? Für Werttyp, für Referenztyp?Beeinflusst Readonly Modifier den Garbage Collector?
Antwort
Ich sehe nicht, warum es den GC bei normalem Gebrauch beeinflussen sollte. Es ist nur ein Feld. Und der GC folgt einfach Bezugstypfeldern (oder Referenzen, die in Strukturfeldern enthalten sind).
Sie könnten möglicherweise künstliche Szenarien konstruieren, in denen es den GC beeinflusst (vielleicht missbrauchen defensive Kopien des Readonly-Feldes), aber es wird nicht mit normaler Verwendung auftreten.
Und natürlich können Sie nicht das Feld gesetzt, ein Verfahren wie Dispose
auf null in die nützlich sein könnte, wenn Sie teure Besitz Objekte bereit für GC haben wollen, während etwas einen Verweis auf das enthaltende Objekt enthält.
Schlechte Probe eines Programms Verhaltensänderung aufgrund readonly
Dieses Programm zeigt, dass nur ein Feld Wechsel von nicht nur lesbar auf Nur-Lesen-Sammlung eines Objekts mit ansonsten identischen Code verhindern kann. Es missbraucht, dass ein schreibgeschütztes Feld beim Methodenaufruf kopiert wird, um das Obj-Feld in der schreibbaren Struktur auf null zu setzen und den Verweis in der readonly-Struktur beizubehalten. Da verhindert wird, dass die Referenz null wird, verhindert sie, dass das Objekt erfasst wird.
Das hat natürlich keinen Einfluss auf den GC. Stattdessen wird die Semantik von readonly missbraucht, um einen anderen Objektgraphen mit readonly als ohne zu erstellen. Also ist Jareds Aussage immer noch völlig richtig.
struct EvilStruct
{
public readonly object Obj;
public void SetToNull()
{
this=new EvilStruct();
}
public EvilStruct(object obj)
{
Obj=obj;
}
}
readonly EvilStruct s1=new EvilStruct(new object());
EvilStruct s2=new EvilStruct(new object());
void Main()
{
s1.SetToNull();
s2.SetToNull();
s1.Obj.Dump();//An instance of System.Object
s2.Obj.Dump();//null
//now s1.Obj can't be collected, but what was once in s2.Obj can
}
Es tut nicht. Readonly ändert das Feld selbst nicht, worauf es hinweist. Das Objekt wird irgendwann gesammelt, wenn es nicht mehr verwurzelt ist. –
Es wurde ein Beispiel für ein Programm gefunden, bei dem ein Objekt schreibgeschützt verhindert wird. – CodesInChaos
Im besten Fall zeigt dieses Programm, dass Sie es nicht kompiliert haben, es zu kompilieren, da es keine "Dump" -Methode in "Object" gibt. Außerdem ist deine "Main" -Funktion nicht statisch, und wenn es so ist, kannst du nicht auf 's1' und' s2' zugreifen. –
Nein, tut es nicht. Der GC funktioniert, indem er Speicher für Objekte zurückfordert, die von keinem der verwurzelten Objekte erreichbar sind. Der readonly-Modifikator hat keinen Einfluss auf diesen Prozess. Zwei Objektgraphen, die mit Ausnahme von einem identisch waren, das ein paar schreibfreie Felder hatte, würden in der gleichen Weise gesammelt werden.
readonly
ist eine C# -Funktion. Der GC ist eine CLI-Funktion. Daher kann es einfach nicht den GC überhaupt beeinflussen.
- 1. Warum den Garbage Collector deaktivieren?
- 2. Beeinflusst die Garbage Collection jemals den Stack?
- 3. Xcode: Garbage Collector Einstellung
- 4. LogManager und Garbage Collector
- 5. Kopieren von Garbage Collector
- 6. V8-Garbage-Collector-Fehler
- 7. JRuby - Wie starte ich den Garbage Collector?
- 8. Können wir den Garbage Collector explizit aufrufen?
- 9. Wie erzwinge ich den Garbage Collector?
- 10. v8 | den Garbage Collector manuell initiieren
- 11. Eclipse: Garbage Collector Button
- 12. Garbage Collector asp.net
- 13. aktuellen Mono Standard Garbage Collector
- 14. Garbage Collector Auswirkungen auf Solr
- 15. Xamarin Garbage Collector und zirkuläre Referenzen
- 16. Ruft Garbage Collector Dispose() auf?
- 17. Java Collections und Garbage Collector
- 18. Relative Leistung von Java Garbage First (G1) Garbage Collector?
- 19. Entladen von Objekten für den Garbage Collector in AS3
- 20. Wie stoppe ich den Android Garbage Collector? Ist es möglich?
- 21. Garbage Collector und doppelt belegten Speicher
- 22. Cocoa-Netzwerk-Streams und der Garbage Collector
- 23. Wie erkennt Pythons Garbage Collector kreisförmige Referenzen?
- 24. JAVA Multi-Threading, Speicherleck, Garbage Collector
- 25. Gibt JavaScript Garbage Collector globale Variablen an?
- 26. UIWebView Lecks, JS Garbage Collector & WebCore VMs
- 27. Garbage Collector kann Speicherressourcen nicht wiederherstellen
- 28. Python: Garbage Collector-Verhalten mit Ctypes
- 29. Warum Garbage Collector dbcontext Objekte nicht sammelt
- 30. .NET Garbage Collector und x64 virtueller Speicher
Mögliches Duplikat von http://stackoverflow.com/questions/1152573/does-readonly-c-reduce-memory-usage –