Sind generationsübergreifende Garbage Collectors von Natur aus Cache-freundlich?


38

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?


eine verwandte Metadiskussion über die entsprechenden Tags für die Frage.
Kaveh

Antworten:


19

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.


10

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.


Sie könnten also argumentieren, dass generationsbezogene GCs im Vergleich zu nicht generationsbezogenen (klassischen) GCs cachefreundlich sind?
Raphael

Ich würde argumentieren, dass der GC auf integrierte Weise mit Caches und virtuellem Speicher als Teil seines Designs entworfen werden sollte, was in bestehenden Architekturen schwierig ist. Um jedoch die Antwort zu erweitern: Ja, Generationskollektoren aggregieren / konsolidieren / gruppieren die häufig verwendeten Objekte in zusammenhängendem Speicher, der von Natur aus besser mit dem Cache kompatibel ist als andere Designs, in denen die häufig und selten verwendeten Objekte verstreut / vermischt sind (obwohl letztere wird noch etwas Cache-Vorteil haben).
vzn

1
Ein etwas kniffliger Aspekt beim Zusammenführen von GC- und Caching- / Virtualisierungsarchitekturen ist, dass sich solche Architekturen im Allgemeinen nicht um den Inhalt von Speicherseiten kümmern, sondern in einem GC-System, in dem sie erforderlich sind. Verschiedene Sprachen versprechen Programmierern manchmal unterschiedliche GC-bezogene Funktionen, und es kann schwierig sein, herauszufinden, welche Funktionen auf Betriebssystemebene unterstützt werden sollen. Der beste Ansatz wäre wahrscheinlich zu sagen, dass jedes Objekt einen Zeiger auf eine Struktur enthalten muss, deren anfängliche Felder vom Betriebssystem definiert werden, auf die jedoch möglicherweise sprachspezifische Daten folgen, die das Betriebssystem nicht kennt oder die es nicht interessieren.
Supercat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.