14 Stimmen

Wann sollte man die Garbage Collection NICHT verwenden?

Die offensichtlichen Gründe für den Verzicht auf Garbage Collection sind harte Echtzeit, stark begrenzter Speicher und der Wunsch, mit Zeigern zu hantieren. Gibt es noch andere, weniger diskutierte, gute Gründe, warum jemand die manuelle Speicherverwaltung der GC vorziehen würde?

7voto

Antti Huima Punkte 24441

Es IST möglich, Garbage Collection mit harter Echtzeit zu verwenden, wenn man einen vollständig inkrementellen Garbage Collector mit begrenzter Ausführungszeit pro Byte des zugewiesenen Speichers hat, also ist es verrückterweise NICHT unbedingt ein Grund, Garbage Collection nicht zu verwenden :)

Ein grundsätzliches Problem der Garbage Collection ist jedoch, dass es schwierig ist, die tatsächliche Größe des Arbeitsspeichers abzuschätzen und zu verwalten, da der Garbage Collector den Speicher nur verzögert freigeben kann. Wenn also der Speicher begrenzt ist, ist die Garbage Collection möglicherweise keine gute Wahl.

Ein weiteres Problem bei der Garbage Collection ist, dass sie manchmal das Freigeben anderer Ressourcen wie Dateideskriptoren, Fensterhandles usw. behindert, da der Garbage Collector diese Ressourcen möglicherweise nur verzögert freigibt, was zu einem Aushungern der Ressourcen führt.

Die Garbage Collection kann auch zu Cache Trashing führen, da der Speicher nicht unbedingt lokal zugewiesen wird. So ist zum Beispiel vom Stapel zugewiesener Speicher viel Cache-freundlicher als vom Heap zugewiesene kurzlebige Objekte.

Schließlich verbraucht die Garbage Collection natürlich auch CPU-Zeit :) Wenn Sie also die Speicherverwaltung manuell programmieren können, können Sie die CPU-Zyklen sparen, die der Garbage Collector verbrauchen würde :)

1 Stimmen

Re: CPU-Zeit: Manuelle Speicherverwaltung auch nimmt CPU-Zeit in Anspruch. Moderne Garbage Collectors haben einen Overhead von weniger als 3 %. Ich bezweifle, dass selbst der erfahrenste C-Programmierer deutlich unter 1 % kommen kann. Es gibt zwei Möglichkeiten, dies zu betrachten: entweder ist ein Garbage Collector doppelt so teuer wie ...

0 Stimmen

... manuelle Speicherverwaltung, oder der Unterschied ist vernachlässigbar (~97% vs. ~99%).

2 Stimmen

Steht der Overhead eines Garbage Collectors nicht im Verhältnis zur Menge des verfügbaren "zusätzlichen" Speichers? Wenn man mehr Speicher hinzufügt, muss man weniger oft Müll zurückholen, wodurch der Prozess effektiver wird. Ein altes Ergebnis besagt, dass GC bei einem 16-fachen Speicherverbrauch effizienter ist als manuelle Speicherverwaltung.

3voto

Norman Ramsey Punkte 193087

Vorübergehende Unzurechnungsfähigkeit?

Der einzige Fall, von dem ich weiß, dass Sie ihn noch nicht behandelt haben, ist die so genannte "lebenslange Speicherverwaltung", die manchmal unter dem Namen "Pools" oder "Arenen" oder "Regionen" bekannt ist. Die Idee ist, dass Sie eine Menge von Objekten zuweisen, wahrscheinlich kleine, und sie werden alle auf einmal sterben . Sie haben also einen billigen Zuweiser und erholen sich dann todo die Objekte in einem einzigen freien Vorgang.

Heutzutage gibt es Programmanalysen, die es einem Compiler ermöglichen, dies für Sie zu tun, aber wenn Sie C-Code schreiben, müssen Sie es von Hand tun. Es gibt eine Implementierung mit Beispielen in Dave Hanson's C-Schnittstellen und Implementierungen und wird in der Studie von Fraser und Hanson verwendet lcc Compiler die in C ohne Garbage Collector geschrieben ist.

2voto

easeout Punkte 8603

Bei der Programmierung für eingebettete Geräte mit begrenzten Ressourcen. Das iPhone zum Beispiel verwendet Referenzzählung.

Oder wenn Sie etwas programmieren, das Ihren Computer extrem beansprucht. Ich denke da an SETI@Home und Videospiele.

Ich würde Ihnen raten, Ihren Speicher nicht selbst zu verwalten, es sei denn, die Situation macht es wirklich notwendig. Jemand Berühmtes hat einmal gesagt, dass es doppelt so schwer ist, Code zu debuggen, als ihn zu schreiben. Nun, die Speicherverwaltung ist schon schwer genug :)

0 Stimmen

Viele Mikrocomputer-BASIC-Interpreter in den 1980er Jahren verwendeten Garbage-Collection für Strings, und die Ressourcenbeschränkungen eines VC-20 waren genauso eng wie bei vielen eingebetteten Systemen heute. Allerdings waren die GC-Algorithmen, die in vielen dieser Systeme verwendet wurden, wirklich grauenhaft, aber es wurden einige bessere GC-Funktionen veröffentlicht, die dieselben Datenstrukturen verwenden konnten.

2voto

Arafangion Punkte 10934

Der einzige Grund, Garbage Collection NICHT für die Ressourcenverwaltung zu verwenden, ist, wenn Sie RAII ala C++ verwenden wollen, aber da es nur für den Speicher gilt, ist es selbst dann eine vernünftige Idee, es zu verwenden. (Anmerkung: Es ist immer noch möglich, dies zu tun, mit Problemen im Zusammenhang mit der nicht-deterministischen Finalisierung).

Abgesehen davon kann die Verwendung von Garbage Collection mehr Speicher verbrauchen, als unbedingt erforderlich ist. In stark speicherbeschränkten Bereichen, in denen man nicht einmal den Speicher für die Verwaltung der GC-Routinen (und des Codes) entbehren kann, ist das ebenfalls ein guter Grund, sie nicht zu verwenden.

Wenn die Sprache, die Sie verwenden, standardmäßig keine GC enthält, wie z.B. C++, und Sie RAII verwenden möchten, dann ist das auch ein vernünftiger Grund, obwohl es für einige Probleme sehr nützlich sein kann.

Letztendlich kommt es auf Kompromisse an - je spezieller Ihre Anforderungen sind, insbesondere im Hinblick auf Thread-sichere RAII, desto komplexer ist die Implementierung der GC, und GC bringt Ihnen möglicherweise nicht viel für Ihre Anwendung.

0 Stimmen

"Der einzige Grund, Garbage Collection NICHT für die Ressourcenverwaltung zu verwenden, ist, wenn Sie RAII ala C++ verwenden wollen. Sie können beides verwenden.

0 Stimmen

@JonHarrop: Ich stimme zu, diese Antwort war vor zwei Jahren, aber die Verwendung einer GC in C++ bringt Sie dazu, verschiedene Kompromisse zu untersuchen... Der einzige "transparente" Weg, dies zu tun, ist imho, GC nur an die RAM-Nutzung zu delegieren, d.h. als effizienteres new/delete in einigen Situationen und um die Notwendigkeit zu vermeiden, den "Besitzer" einer Datenstruktur anzugeben, die größtenteils aus reinen Daten besteht (d.h. ohne Nicht-Speicher-Ressourcen). Wenn Sie damit einverstanden sind, können Sie meine Antwort gerne aktualisieren - Sie haben sicherlich genug Ruf :)

0 Stimmen

FWIW Garbage Collection kann auch für externe Ressourcen nützlich sein, die dem Speicher gleichwertig sind. Ich hatte viel Erfolg bei der Verwendung von Finalizern in OCaml, um GC auf Geometrien und Texturen anzuwenden, die auf der Grafikkarte mit OpenGL-Anzeigelisten zwischengespeichert sind.

1voto

DV. Punkte 4525

Emm... der Grund meines Professors ist es, uns (seinen Studenten) das Leben schwer zu machen und uns "das Richtige" beizubringen. Haha :)

Im Allgemeinen ist die Garbage Collection jedoch nicht immer für Ihre spezifische Anwendung optimiert. Wenn Sie also ein guter Programmierer sind, werden Sie mit Sicherheit eine bessere Arbeit bei der Speicherverwaltung leisten, als es GC jemals tun wird.

0 Stimmen

Schlechte Informationen. Lesen Sie Ben Zorns Arbeit über die gemessenen Kosten der konservativen Müllabfuhr. Und das ist konservativ die bekanntlich im Vergleich zu einer genauen GC langsam ist.

0 Stimmen

Was weiß ich schon, ich bin nur ein CS-Student im zweiten Jahr :D

1 Stimmen

@NormanRamsey: Sie zitieren ein Papier, das 19 Jahre alt ist und Messungen auf einem 33MHz SPARC mit 16MB RAM präsentiert, auf dem Single-Thread-Programme laufen, die nur 2.000 Aufrufe an malloc pro Sekunde (weil sie malloc Pools). Ihre Behauptung, dass konvergierende GC in diesem Zusammenhang langsamer als akkurate GC ist, ist ebenfalls unzutreffend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X