Konservative garbage collector
Ich habe gesehen, garbage-Kollektoren Kennzeichnen ist eine Menge Dinge - Generationen, etc. Aber ich habe gesehen, den Boehm GC gekennzeichnet als "konservativ". Was genau bedeutet das?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen garbage collector müssen scan alle Objekte und Anrufungen (execution stack) zu identifizieren, die "live" - Adressen in das auszuführende Programm und dann "sammeln" Objekte, die nicht "live" - Adressen. In einigen Umgebungen ist es möglich, dass der GC-Algorithmus, um genau zu sein und genau wissen, was ist ein Objekt-Adresse ist und was nicht. In anderen Umgebungen, es muss Scannen Teile der Lagerung (vor allem die execution stack), wo es Worte gibt, die Lagerung, die MÖGLICHERWEISE eine Objekt-Adresse ein und stellen Sie die KONSERVATIVE Annahme, dass, wenn es aussieht wie eine gültige Adresse, und es ist ein Objekt, das über die Adresse, wird das Objekt nicht erfasst werden sollen.
Gibt es Vorteile zu der konservativen Sammlung, vor allem, dass der code-generator (wenn nicht interpretiert) ist freier Variablen zuweisen, wo und Wann es Sie braucht und es müssen nicht halten rigorose verfolgen die Objekt-Zeigern. (Die auf der Spur bleiben müssen Objekt-pointer-Positionen können dazu führen, dass weniger gut optimierten code, zusätzlich zu den code-generator wesentlich komplexer. Auch ein konservativer Sammler steht eine vernünftige chance, mit einem compiler, die nie beabsichtigt war, um Unterstützung garbage collection, während eine präzise Sammler würde erfordern, dass der compiler verändert werden.)
Den großen Nachteil, dass der konservative Ansatz ist, dass eine vollständige "Vervielfältigung", die Sammler nicht umgesetzt werden. Wenn das kopieren fertig ist der Zeiger auf die kopierten Objekte aktualisiert werden müssen, und wenn es nicht klar ist, ob eine gegebene bit-Wert ist ein Zeiger auf ein Objekt oder einfach nur ein numerischer Wert, es kann nicht sicher festgestellt, ob oder nicht es sollte geändert werden, wenn das Objekt kopiert wird. Es gibt auch den Nachteil, dass einige "tote" Objekte, die bis Ende Mai nicht immer erhoben, aufgrund der zufälligen bit-mustern, die Aussehen wie Ihre Adressen, obwohl in der Praxis dies ist nicht ein ernstes Problem.
Einen konservativen garbage collector ist, dass Sie nicht wissen, ob ein gegebenes Wort ist ein Zeiger. Wenn das Wort Punkte in einem zugewiesenen heap-block, dann der garbage collector konservativ davon ausgegangen, dass das Wort ist ein Zeiger und daher nicht recyceln, dass die heap-block oder alles, was als erreichbar zu sein von ihm.
Der wesentliche Vorteil dieses Ansatzes ist, dass Sie sammeln können, nicht erreichbar-Werte, die ohne zu arbeiten in Harmonie mit dem compiler. Es gibt jedoch viele Nachteile:
Werte, die zufällig Aussehen wie Zeiger zu Speicherverlusten durch die Verhinderung von teilen der heap wird recycelt. Dies ist ein viel größeres problem mit 32-bit-Adresse, Leerzeichen, weil fast jeder int Punkt wird zu einem heap-block, wenn GBs von RAM zugeteilt wurden.
Bestimmung, ob oder nicht ein Wort Punkte in einem zugewiesenen heap-block benötigt der heap durchsucht werden, die langsam ist und die (Objektiv) unnötig.
Den GC kann sich nicht bewegen heap-Blöcke nicht, da es keine update-Zeiger, weil Sie nicht wissen, wo Sie alle sind.
Code versteckt, dass die Zeiger oder Zeiger verwendet, die außerhalb der heap-block-crash-einem konservativen GC. Dieses problem entstand mit der Numerischen Rezepte-code und Boehm GC, wenn auch da die NR C-code gegen die C-spec.
Diese Nachteile sind schwerwiegend genug, dass die Produktion garbage-Kollektoren versuchen, nicht konservativ zu sein, Wann immer möglich.