Ein typischer Garbage Collector der Generation speichert kürzlich zugewiesene Daten in einem separaten Speicherbereich. In typischen Programmen sind viele Daten nur von kurzer Dauer. Daher ist das häufige Sammeln von jungem Müll (ein kleinerer GC-Zyklus) und das seltene Sammeln von altem Müll ein guter Kompromiss zwischen Speicheraufwand und Zeitaufwand für die GC.
Intuitiv sollte sich der Nutzen eines generativen Garbage Collectors im Vergleich zu einem Single-Region-Collector mit zunehmender Latenz des Hauptspeichers im Verhältnis zum Cache erhöhen, da auf die Daten in der jungen Region häufig zugegriffen wird und alle an einem Ort aufbewahrt werden. Bestätigen experimentelle Ergebnisse diese Intuition?
programming-languages
computer-architecture
cpu-cache
garbage-collection
Gilles 'SO - hör auf böse zu sein'
quelle
quelle
Antworten:
Hier sind einige Artikel, die sich mit den Cache-Auswirkungen von Müllsammlern der Generation befassen:
Soweit ich das beurteilen kann, besteht das Hauptproblem darin, dass müllsammelnde Systeme den Speicherplatz im Arbeitsspeicher ausgleichen, um eine Voraussammlung zu vermeiden. Gleiches gilt für den Cache-Speicher. Wie Sie angedeutet haben, werden die Dinge in der ersten Generation höchstwahrscheinlich im Cache gespeichert sein, sodass ihre Zuweisung und Sammlung viel schneller als im Hauptspeicher oder auf die Festplatte ausgelagert sein wird. Das Hauptproblem ist die Größe der ersten Generation in Bezug auf die Größe Ihres Caches. Wenn sich Ihr Cache vor der ersten Generation füllt, verlieren Sie diese Vorteile, wenn sich die Fehler häufen.
quelle
Es gibt einen sehr kniffligen Aspekt bei allen Garbage Collectors, der in einigen Beschreibungen möglicherweise vertuscht wird, nämlich "Vollständiger Scan" oder "Vollständiges Sammeln". In regelmäßigen Abständen, in zufälligen Abständen, müssen sie alle Objekte scannen. Generationen von Sammlern sind besser in der Lage, den vollständigen Scan zu verschieben und seine Dauer zu minimieren, dies ist jedoch weiterhin erforderlich.
Der Generationssammler konzentriert sich auf das, was manchmal als "Kinderzimmer" bezeichnet wird, muss sich aber schließlich / unweigerlich auf den "älteren" Generationsraum konzentrieren, wodurch ein vollständiger Speicher-Scan durchgeführt wird.
Dieser vollständige Scan ist mit fast allen Speicher-Caching- und (insbesondere!) Virtualisierungsschemata in dem Sinne nicht kompatibel, dass in diesem Fall fast alle Speicher-Caching- / Virtualisierungsschemata bei einer Leistungsverbesserung schlecht ausfallen (müssen).
Die zentrale Antwort auf diese Frage lautet also, wie oft der vollständige Scan ausgelöst wird und wie "schlecht" seine Auswirkung ist, wenn er auftritt und ob er toleriert werden kann. Dies führt zu einer eher anwendungsabhängigen Eigenschaft / Frage.
Mit anderen Worten, für "die meisten" Vorgänge des Sammlers wird wahrscheinlich ein Cache hilfreich sein (der Cache und der "junge" Kindergartenbereich überlappen sich im Allgemeinen!), Aber es gibt einen periodischen, intermittierenden, eventuellen, unvermeidlichen, schweren, Vielleicht sogar ein "massiver" Leistungsanstieg, wenn der Speicherplatz der "alten Generation" voll ist und die "Trefferrate" des Caches sehr schlecht wird, da viele Objekte außerhalb desselben alle in einer engen Schleife durch den vollen Speicher abgerufen werden Scan- / Sammelzyklus. Mit anderen Worten, eine unausweichliche periodische Diskontinuität (wenn statistische Schätzungen / Durchschnitte / Leistungstrends usw. irreführend und nicht anwendbar sind).
Was jetzt auftaucht, sind einige neue Erfassungssysteme, die so konzipiert sind, dass sie mit den zugrunde liegenden Speicherverwaltungssystemen (Caching / Virtualisierung) verzahnt sind. Es scheint, dass historische Ansätze, die die getrennten Systeme der Speichererfassung, Zwischenspeicherung und Virtualisierung vollständig entkoppeln, nicht so gut funktionieren wie Ansätze, die alle drei Aspekte miteinander kombinieren / integrieren / ansprechen.
Siehe zB Cache-fähige Garbage Collection von Zhou und Demsky.
quelle