Frage

Ich bin ein C ++ Programmierer gerade die Arbeit an Java versuchen. Die Arbeit an C ++ Ich habe eine Gewohnheit Spur dynamischer Speicherzuordnungen zu halten und verschiedene Techniken wie RAII zu vermeiden Speicherverlust einsetzt. Java, wie wir ein Garbage Collector (GC) wissen von Speicher leaks.So kümmern, während in Java Programmierung sollte man nur alle gesunden Sorgen des Heap-Speichers gehen lassen und es lassen GC Pflege der Speicherlecks nehmen oder sollte man haben einen ähnlichen Ansatz wie die während Programmiersprachen ohne GC, versuchen Pflege des Speichers nehmen Sie zuweisen und nur GC kümmern sich um diejenigen zu lassen, dass Sie verpassen könnten. Was sollte der Ansatz sein? Was sind die Nachteile von entweder?

War es hilfreich?

Lösung

Ich bin sicher nicht, was Sie mit kümmern sich um den Speicher versuchen, Sie in Anwesenheit eines GC zuweisen, aber ich werde einige Gedankenlesen versuchen.

Grundsätzlich sollten Sie nicht „Sorge“ über Ihr Gedächtnis gesammelt. Wenn Sie Objekte nicht mehr verweisen, werden sie abgeholt werden. Logische Speicherlecks sind immer noch möglich, wenn Sie eine Situation schaffen, in der Objekte für den Rest des Programms referenziert werden (Beispiel: Hörer registrieren und nie un registrieren sie, Beispiel: Vektor-ähnliche Sammlung implementieren, die nicht Elemente null gesetzt, wenn Entfernen von Elementen aus dem Ende).

Wenn Sie jedoch einen starken RAII Hintergrund haben, werden Sie enttäuscht sein zu erfahren, dass es keine direkte Entsprechung in Java. Die GC ist ein erstklassiges Werkzeug mit Speicher für den Umgang, aber es gibt keine Garantie, wenn (oder auch wenn) Finalizers genannt werden. Dies bedeutet, dass die First-Class-Behandlung auf den Speicher angewendet ist nicht angewendet jede andere Ressource, wie zB:. Fenster, Datenbankverbindungen, Steckdosen, Dateien, Synchronisation Primitiven, etc

Andere Tipps

Mit Java und .net (und ich denke, die meisten anderen GC'ed Sprachen), können Sie nicht viel über Heap-Speicher überhaupt zu kümmern. Was Sie tun Grund zur Sorge über, stammen Ressourcen wie Datei-Handles, Steckdosen, GUI-Primitiven wie Schriftarten und so. Diejenigen, müssen in der Regel „entsorgt“ werden, die die einheimischen Ressourcen freigibt. (Sie selbst oft auf Abschluss verfügen sowieso, aber es ist ein bisschen iffy auf das zurückzugreifen. Entsorgen Sachen selbst.)

Mit einem GC, müssen Sie:

  • immer noch darauf achten, richtig zu Nicht-Speicher-Ressourcen wie Datei-Handles und DB-Verbindungen freisetzen.
  • stellen Sie sicher, Sie halten keine Verweise auf Objekte, die Sie nicht mehr benötigen (wie sie in einer Sammlung zu halten). Denn wenn Sie das tun, haben Sie einen Speicherverlust.

Abgesehen davon, dass Sie kann nicht wirklich „kümmern sich um den Speicher, den Sie zuweisen“, und so wäre eine Verschwendung von Zeit zu tun versuchen.

Technisch Sie nicht Sorge brauchen etwa nach Speicherzuordnungen Reinigung, da alle Objekte richtig gezählt Bezug nimmt und der GC wird sich um alles kümmern. In der Praxis wird eine überaktive GC negativ auf die Leistung auswirken. Während also die Java keinen delete Operator haben, werden Sie gut tun, um die Wiederverwendung Objekte so viel wie möglich.

Auch Java hat keine Destruktoren da Objekte bestehen werden, bis der GC ihnen bekommt ,. Java hat daher das finally Konstrukt, das Sie, dass alle Nicht-speicherbezogenen Ressourcen (Dateien Steckdosen usw.) geschlossen werden, um sicherzustellen, verwenden sollten, wenn Sie mit ihnen fertig sind. Verlassen Sie sich nicht auf der finalise Methode, dies zu tun für Sie.

In Java die GC kümmern Speicher die Zuweisung und ungenutzte Speicher zu befreien. Dies bedeutet nicht, dass Sie das Problem alltogether außer Acht lassen können.

Die Java GC gibt frei Objekte, die haben, werden nicht von der Wurzel verwiesen. Dies bedeutet, dass Java noch Speicherlecks, wenn Sie keine Referenzen von globalen Zusammenhängen wie Caches im globalen HashMaps zu entfernen sind Achtung, etc.

Wenn eine Gruppe von Objekten, der Bezug sich nicht von der Wurzel Bezug genommen wird, wird die Java GC sie kostenlos. D. h Es funktioniert nicht mit Bezug zählt, so dass Sie alle Objektreferenzen nicht müssen null (auch wenn einige Kodierungs Arten Clearing Referenzen als sonn bevorzugen, da sie nicht mehr benötigt werden.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top