Hier sind die Fakten:
Die Sprache Go hat einen Garbage Collector.
Java hat eine Garbage Collection
Viele Java-Programme haben (subtile oder nicht) Speicherlecks
Als Beispiel für ein Java-Programm mit Speicherlecks (nicht für schwache Nerven kann die Frage Ihre Überzeugungen erschüttern) finden Sie hier ein kleines Java-Programm namens Tomcat, das sogar die Schaltfläche "Lecks suchen" hat: Gibt es einen Weg? um Speicherverluste bei der Bereitstellung in Tomcat zu vermeiden?
Ich frage mich also: Werden in Go geschriebene Programme die gleichen (subtilen oder nicht) Speicherlecks aufweisen, die einige in Java geschriebene Programme aufweisen?
java
memory-leaks
go
SyntaxT3rr0r
quelle
quelle
memory leak
ist besser als deine" hinausläuft.Antworten:
Sie verwechseln hier verschiedene Arten von Speicherlecks.
Die abscheulichen, auf expliziter Speicherverwaltung basierenden Speicherlecks sind in Java (oder einer anderen GC-basierten Sprache) verschwunden. Diese Lecks werden dadurch verursacht, dass der Zugriff auf Speicherblöcke vollständig verloren geht, ohne dass diese als nicht verwendet markiert werden.
Die "Speicherlecks", die in Java und jeder anderen Sprache auf dem Planeten noch vorhanden sind, bis der Computer unsere Gedanken lesen kann, sind immer noch bei uns und werden auf absehbare Zeit auftreten. Diese Lecks werden dadurch verursacht, dass der Code / Programmierer Verweise auf Objekte aufbewahrt, die technisch nicht mehr benötigt werden. Dies sind grundsätzlich logische Fehler, die mit aktuellen Technologien in keiner Sprache verhindert werden können.
quelle
java.util.logging.Level
das eine private Statik enthält,ArrayList
in die alle diese Objekte eingebaut sind platziert auf dem Bau, und von dem sie nie entfernt werden), die es schwieriger macht , sie zu vermeiden , wenn die Java - Programmierung als in einer anderen Sprache , die nicht solche Fehler nicht enthältEs ist sehr wahrscheinlich, dass Go-Programme Speicherlecks aufweisen. Die aktuelle Implementierung von Go verfügt über einen einfachen Mark-and-Sweep-Garbage-Collector. Dies ist nur als vorübergehende Lösung gedacht und nicht als langfristiger Garbage Collector. Weitere Informationen finden Sie auf dieser Seite . Schauen Sie unter die Überschrift
Go Garbage Collector
. Diese Seite enthält sogar einen Link zum Code für die aktuelle Version, wenn Sie dazu neigen.quelle
Ein "Speicherverlust" liegt vor, wenn ein Speicherelement, von dem der Programmierer dachte, dass es freigegeben wird, nicht freigegeben wird. Dies kann in jeder Sprache geschehen, ob Müll gesammelt wird oder nicht. Die übliche Ursache in GC-Sprachen besteht darin, einen zusätzlichen Verweis auf den Speicher beizubehalten.
"Sprachen verursachen keine Speicherlecks, Programmierer verursachen Speicherlecks".
quelle
Garbage Collection oder nicht, Sie können ein Programm schreiben, das zum größten Teil Speicherlecks in Java, Go oder einer anderen Sprache aufweist.
Die Speicherbereinigung entlastet den Programmierer zwar etwas, verhindert jedoch Leckagen nicht vollständig.
quelle
Sie mischen hier Abstraktionsebenen: Die Speicherlecks sind auf Fehler in der Bibliothek zurückzuführen (bei denen Objekte aufeinander verweisen, obwohl Ketten von 'a auf b verweisen') sowie auf einen Kompromiss bei der Implementierung des Garbage Collector zwischen Effizienz und Genauigkeit. Wie viel Zeit möchten Sie für das Auffinden solcher Schleifen aufwenden? Wenn Sie doppelt so viel Zeit aufwenden, können Sie Schleifen doppelt so lange erkennen.
Das Problem mit dem Speicherverlust ist also nicht programmiersprachenspezifisch. Es gibt keinen Grund, warum GO für sich genommen besser oder schlechter als Java sein sollte.
quelle