2009-05-27 6 views
13

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?

+0

Vergessen Sie nicht, dass große Objekte (85.000 Bytes oder mehr) in Generation 2 gestartet werden. – RichardOD

Antwort

20

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.

3

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ß.

3

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:

  1. 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.
  2. sammeln
  3. Der Heap verdichtet wird (Lücken entfernt werden)
  4. 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.

+0

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. –

+0

@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. –

+0

Garbage Collection wird ausgeführt, wenn die Nullgenerierung voll ist, also denke ich, dass es keinen Fehler gibt. – spkenny