Was kann und kann der Garbage Collector nicht?


8

Kümmert sich der GC um alle Speicherverwaltungsprobleme (Speicherlecks)?

Gibt es einen Fall, in dem der GC nicht die Kontrolle über einen Teil Ihres Codes übernehmen soll?


Es kann sich nicht selbst sammeln, obwohl es sollte.
Rechtsfalte

Antworten:


10

Es wird sich um die klassischen Speicherverwaltungsprobleme kümmern (zugewiesener Speicher wird nicht deaktiviert, wenn er nicht mehr verwendet wird), obwohl es bei einem GC-System immer noch zu Speicherlecks kommen kann - dies ist subtiler und tritt auf, wenn Objekte noch Referenzen enthalten zu anderen Objekten, auch wenn sie nicht mehr müssen.

Siehe die Frage Warum kann .NET keine Speicherlecks aufweisen? und es sind Antworten auf StackOverflow.

Es kann x. Situationen, in denen Sie die vollständige Kontrolle über die Speicherzuweisung wünschen, aber ehrlich gesagt, sind die Vorteile eines GC-Systems so, dass Sie dies normalerweise nicht benötigen.


1
Die einzigen Situationen, in denen ich mir vorstellen kann, dass die Strafen zu hoch sind, sind Systeme, die sehr schnell große Datenmengen durch begrenzten Speicher wie High-End-Grafiken oder Systeme mit sehr begrenztem Speicher wie einen eingebetteten Controller übertragen.
Weltingenieur

@WorldEngineer - True. Aus diesem Grund hat .NET Objekte angeheftet, sodass Sie mehr Kontrolle über Speicherbereiche haben.
Oded

High Performance Computing, Handelssysteme mit geringer Latenz usw. würden alle gerne die Kontrolle über ihren GC haben :-)
Martijn Verburg

Oh, sie könnten es gut stimmen . Es gibt sogar eine ganze Klasse von High-End-GCs, die Pausen klein machen und den Zeitaufwand für GC (inkrementelle und gleichzeitige GCs) mit produktionsbereiten Canidaten begrenzen sollen. Aber anscheinend reicht selbst das einigen von ihnen nicht (ich kann nicht sagen, ob das vernünftig ist). Also verlassen sie es zusammen mit der JIT-Kompilierung.

@SamSaffron hat diesen Link auf Twitter zu einem Artikel gepostet, in dem das explizite Verhalten von GC (ab) verwendet wurde, um einen Vorteil zu erlangen. Marcgravell.blogspot.com/2011/10/assault-by-gc.html
Carlo Kuip

2

Es gibt viele Speicherprobleme (baumelnde Zeiger, Pufferüberläufe und ähnliches) und Ressourcenprobleme (Speicherlecks, andere Ressourcenlecks). Garbage Collector kümmert sich um:

  • baumelnde Zeiger
  • meistens Speicherlecks
  • teilweise andere Ressourcenlecks

Die Sprache, die keine Zeigerarithmetik zulässt, kümmert sich um:

  • Pufferüberläufe und andere Fälle ungültiger Zeiger

Beides kann keine anderen Fälle von Ressourcenproblemen lösen, bei denen Sie vergessen, den Verweis auf den Speicher / die Ressource von irgendwoher zu entfernen, sodass bei GC immer noch ein Speicherverlust auftreten kann (Ausnahmeobjekte sind besonders bemerkenswert, wenn sie auf viele Dinge verweisen, die Ihnen nicht bekannt sind).

Während GC Ihnen bei der Freigabe anderer Ressourcen als Speicher mithilfe von Finalisierern (Destruktoren) helfen kann, werden diese Ressourcen mit nicht deterministischer Verzögerung freigegeben, was für Ressourcen wie Dateien oder Netzwerksockets häufig nicht geeignet ist. Um diese Art von Ressourcenproblemen zu lösen, benötigen Sie ein Sprachkonstrukt für Ressourcen mit Gültigkeitsbereich, z. B. die Verwendung von Anweisungen in C #, RAII-Redewendungen in C ++ oder die neueste Erweiterung, um die Syntax in Java 7 zu testen. Dies ist immer noch nur hilfreich, da Sie sie im Code verwenden müssen .

Es ist erforderlich, keine Zeigerarithmetik zuzulassen und Adressen aus Zahlen zu erstellen, um einen präzisen Garbage Collector ausführen zu können. Einige nützliche Optimierungen wie das Komprimieren können nur in präzisen Kollektoren implementiert werden (Sie können Objekte nur verschieben, wenn Sie sicher sind, was eine Referenz ist, damit Sie sie aktualisieren können; dies ist in C / C ++ nicht möglich).


1

Die Speicherbereinigung funktioniert gut für den Speicher. Wenn Sie eine Menge Speicher haben, warum sollten Sie dann jedes Byte aufräumen, wenn es fertig ist? GC reagiert normalerweise auf "Speicherdruck" und bereinigt bei Bedarf. Dies ist eine gute Sache für die Erinnerung. Wenn Sie jedoch ein Objekt haben, das eine Nicht-Speicherressource (Dateihandle, Datenbankverbindung, Sperre) enthält und darauf wartet, dass der Speicherdruck GC auslöst, bedeutet dies im Allgemeinen, dass diese Ressource viel zu lange gehalten wird. Sie benötigen einen anderen Ansatz für diese Ressourcen. Dies kann eine gemeinsam genutzte Ressource für die Referenzzählung mit deterministischer Freigabe bedeuten, wenn die Referenzanzahl Null erreicht, oder den Using / Dispose-Ansatz von .NET.


0

GC Systems ist eine Software, die versucht, die Speichernutzung für ein laufendes Programm zu optimieren.

Das GS-System liegt in der Verantwortung und ist Bestandteil des Frameworks (JVM / .NET).

Es kann Speicher für einige Objekte freigeben, von denen vorhergesagt wird, dass sie nach einem bestimmten Punkt in der Verarbeitung von einer Anwendung nicht mehr benötigt werden.

In .NET kann nur Speicher für einige native .NET-Objekte und nicht für MS COM-Objekte freigegeben werden.

In .NET verwendete MS COM-Objekte müssen explizit freigegeben werden.

Verweise:

MSDN: Speicherbereinigung

Wikipedia: Gabage Collection


Warum herabgestuft - Ihr Feedback wird geschätzt?
NoChance
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.