Antworten:
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.
Es gibt viele Speicherprobleme (baumelnde Zeiger, Pufferüberläufe und ähnliches) und Ressourcenprobleme (Speicherlecks, andere Ressourcenlecks). Garbage Collector kümmert sich um:
Die Sprache, die keine Zeigerarithmetik zulässt, kümmert sich um:
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).
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.
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: