Ich lese gerade CLR via C# jetzt und habe einige Fragen über Garbage Collection in .NET. Nachdem die Generation 0 gefüllt ist, wird in dem Buch die Garbage Collection gestartet und alle ausstehenden Objektreferenzen werden auf die Generation 1 verschoben. Dasselbe geschieht, wenn die Generation 1 gefüllt ist. Aber was passiert, wenn die zweite Generation gefüllt ist? Es gibt keine anderen Generationen, um Referenzen zu verschieben. Wird die Größe von Generation 2 um die CLR erweitert?Was passiert während der Garbage Collection, wenn die Generation 2 gefüllt ist?
Antwort
Ja, es wird die Größe der Generation 2 erweitern, wenn es möglich ist. Wenn kein Platz mehr verfügbar ist, erhalten Sie eine OutOfMemoryException
.
Bei den verschiedenen Generationen der Garbage Collection geht es nicht um eine bestimmte Größe, sondern darum, wie alt der Müll ist. Keine der Generationen hat Größenbeschränkungen, von denen ich weiß.
Von meinem Verständnis gibt es nur einen Haufen (ironischerweise wird es normalerweise als ein Stapel dargestellt). Objekte werden auf Generation 1 hochgestuft, nicht wenn Generation 0 gefüllt wird, sondern wenn sie eine Sammlung überleben. Kurz gesagt, Referenzen werden nicht "verschoben", der Ort, der verwendet wird, um zu identifizieren, wo die Generation endet, wird verschoben.
Wenn der Haufen kurz davor voll ist, kommen ein paar Dinge:
- Jede Generation gesammelt wird, von 0 beginnend und mit 2.
- Wenn Sammlung von Generation endet 0 ausreicht, es wird nicht sammeln Generation 1 und 2
- Wenn Sammlung von Generation 0 nicht ausreichend ist, aber Sammlung von Generation 1 ist, wird es nicht Generation 2.
sammeln
- Der Heap verdichtet wird (Lücken entfernt werden)
- Generationen fördern
- Generation 1 als Überlebende Generation markiert sind 2.
- Generation 0 Überlebenden als Generation markiert sind 1.
Objekte, die die Sammlung überleben, werden dann in Generation 0 (wenn dies ihr erster Sammelzyklus ist) oder in Generation 2 (wenn sie mehr als eine Sammlung überlebt haben) verschoben. Dies geschieht aus Effizienzgründen, um sicherzustellen, dass wir nicht ständig versuchen, langlebige Objekte zu sammeln.
Sie haben nicht genug Platz auf generationsspezifische Weise. See this article für eine gute Erklärung.
Ich glaube nicht, dass Objekte als solche markiert sind. Die CLR verfolgt, welche Segmente von den verschiedenen Generationen verwendet werden, also ist es umgekehrt. Die CLR kann die Generierung eines Objekts anhand seines Speicherorts auf dem verwalteten Heap ermitteln. –
@Brian, sorry, wenn ich nicht klar war, wollte ich sagen, dass die Laufzeit verfolgt, wo jede Generation endet, so dass Objekte, die zum Heap "über" hinzugefügt werden, zu einer niedrigeren Generation gehören. Ich bin mir sicher, dass ich zu stark vereinfache, aber Sie haben recht, es gibt kein "Tracking" auf der Basis der einzelnen Objekte. –
Garbage Collection wird ausgeführt, wenn die Nullgenerierung voll ist, also denke ich, dass es keinen Fehler gibt. – spkenny
- 1. Was passiert, wenn PHP Session Garbage Collection lange braucht?
- 2. Javacard - Stromausfall während der Garbage Collection
- 3. php garbage collection während Skript läuft
- 4. Was ist die Verbindung von Autorelease-Pool zu Garbage Collection?
- 5. Was sind die Generationen in Garbage Collection?
- 6. Garbage Collection
- 7. Best Practice mit Garbage Collection, wenn Anwendung Global Cache hat
- 8. Garbage Collection und Strings
- 9. Unity3D: Garbage Collection optimieren
- 10. AutoCloseable und Garbage Collection Beziehung
- 11. THREE.js webGL Garbage Collection
- 12. Garbage Collection in C++/CLI
- 13. nodejs garbage collection output
- 14. Wie funktioniert die Garbage Collection bei Objektreferenzen?
- 15. Python-Threads Garbage Collection
- 16. . Net Garbage Collection auf LoH
- 17. Beeinflusst die Garbage Collection jemals den Stack?
- 18. java garbage collection
- 19. Java Garbage Collection Zeit?
- 20. Querverweise und Garbage Collection
- 21. Sollte die Garbage Collection schon gelaufen sein?
- 22. Knockout ViewModel berechnete Garbage Collection
- 23. requestAnimationFrame Garbage Collection
- 24. Java 8 Metaspace Garbage Collection
- 25. asp.net Garbage Collection Benachrichtigungen
- 26. Hardware Assisted Garbage Collection
- 27. Garbage Collection in Perl
- 28. Garbage Collection in CGO
- 29. Forcing Garbage Collection
- 30. Garbage Collection in bash
Vergessen Sie nicht, dass große Objekte (85.000 Bytes oder mehr) in Generation 2 gestartet werden. – RichardOD