Wie zerstöre ich Java-Objekte?

7

Nun, ich habe eine Java-Anwendung entwickelt, die mehrere Objektbeziehungen verwendet, die die Speichernutzung zu teuer machen. Ich habe keine Erfahrung darin, den Java-Speicher zu verwalten, weil das Anwendungsdesign es schwierig macht, Objekte zu zerstören und den zuvor gelöschten Platz wiederzuverwenden. Zum Beispiel verwende ich Beobachter und MVC-Muster.

Also, die Theorie sagt das ..

  

Ein Objekt wird für Garbage collection oder GC berechtigt, wenn dies nicht der Fall ist   erreichbar von allen Live-Threads oder jeder statischen Referenz

Mit anderen Worten können Sie sagen, dass ein Objekt für die Garbage Collection geeignet wird, wenn alle Referenzen null sind.

Aber in meiner kurzen Erfahrung ist es zu schwierig für mich, alle Referenzen von Objekten zu zerstören, die ich aus dem Speicher entfernen möchte (zum Beispiel, wenn ein Rahmen geschlossen wird), wenn Sie ein Szenario wie meines haben. Sie wissen, wie viele Referenzen auf Ihre Klassen existieren.

Wie kann ich in diesem Kontext mit der Zerstörung von Objekten umgehen, wenn mehrere Referenzen darauf verweisen? oder wie muss ich den Speicher verwalten, wenn Sie eine komplexe Beziehung zueinander haben?

    
manix 10.07.2012, 00:07
quelle

5 Antworten

17

Verfolgung

  

Wie kann ich in diesem Kontext mit der Objektzerstörung umgehen, wenn mehrere Referenzen darauf vorhanden sind?

Indem Sie sicherstellen, dass diese Referenzen nicht mehr benötigt werden.

Wenn Sie sie isolieren, sogar in einem großen isolierten Diagramm nicht verwendeter Objekte, die nicht mehr mit Ihrem Hauptprogramm verbunden sind, dann sind alle für die Garbage Collection geeignet . p>

Lokale Variablen, die das Ende ihres Gültigkeitsbereichs erreicht haben, sind für die Garbage-Collection (und damit ihre enthaltenen) -Objekte geeignet, wenn sie nicht mit etwas anderem "verknüpft" wurden (hinzugefügt zu einer Sammlung, einem Composite usw.) ..). Für UI-Objekte, die in Bezug auf Objektdiagramme in der Tat schwierig zu verstehen sind, stellen Sie sicher, dass Sie sie richtig entsorgen oder die Dokumentation lesen, um sicherzustellen, dass sie natürlich entsorgt werden.

"Leave [GC] Allone !!"

  

oder wie muss ich den Speicher verwalten, wenn Sie eine komplexe Beziehung zueinander haben?

Sie können den Speicher nicht "verwalten". Sie können Referenzen einfach verwalten. Die Idee ist, Ihre Verbindungen zu Ihren Objekten zu "schärfen", indem Sie einfach keine Referenzen darauf haben. Sie leben dann in Erinnerung, bis der GC sie ausrottet.

Versuchen Sie nicht, sich mit dem GC zu befassen, um ihn dazu zu zwingen, Dinge zu tun. Es ist ein ziemlich cleveres Biest, und obwohl Sie versuchen können es anzuweisen, explizit auf Anfragen zu reagieren - es könnte Sie ignorieren - es ist normalerweise eine schlechte Idee : nicht rufen Sie den GC explizit auf , vermeiden Sie Finalizer und explizites Nullen wenn Sie ihre Implikationen nicht verstehen .

Hinweis, um Ihren Kommentar zu beantworten

Wenn Sie einfach einen Verweis auf ein Objekt aufheben, das zu mehreren Sammlungen oder Zusammensetzungen hinzugefügt wurde, wird es nicht mehr für die Sammlung ausgewählt. Wenn Sie dies getan haben, hätten Sie nur einen Verweis auf Null gesetzt .

Sie müssen dieses Objekt aus allen Listen oder Containern entfernen, die eine Referenz darauf haben (im Grunde genommen, um sie über dieses Objekt "vergessen" zu lassen). Sobald sich keine Objekte mehr an Ihr erstelltes Objekt "erinnern" oder eine "Verknüpfung" mit ihm haben, wird es zu einem einsamen Objekt im Garbage-Collector-Diagramm, was es zu einem Löschkandidaten macht.

Vielleicht klingt es mühsam, aber wenn Sie es aus einer Sprache kennen, in der Sie Speicher manuell verwalten (C oder C ++, um die 2 offensichtlichsten Referenzen zu nennen), würden die Zeiger auf Ihre dynamisch zugewiesenen Objekte frei und null sein tatsächlich, sie zu zerstören, aber Sie müssten immer noch das Element aus den Listen (oder irgendwelche Container) entfernen, oder sie würden wie leere Eimer zu einem Nullzeiger erscheinen.

Weiter lesen

haylem 10.07.2012, 00:14
quelle
6

Der springende Punkt bei der Java-Garbage-Collection ist, dass Sie nichts tun müssen. Garbage Collection ist für Sie erledigt.

    
emory 10.07.2012 00:11
quelle
1

Weisen Sie jede Referenz zu, die der GC in null sammeln soll.

    
Cuga 10.07.2012 00:14
quelle
1

Was Sie tun könnten, ist eine Zwischenklasse zu machen. Wenn Sie beispielsweise eine Instanz der Klasse A haben, für die Sie viele Referenzen haben und die Sie entfernen möchten, aber viele Referenzen dies schwierig machen, können Sie Folgendes tun: Erstellen Sie eine Instanz der Klasse B, die nichts anderes als enthält Verweis auf Instanz der Klasse A (wie eine Art Proxy). Jetzt haben Sie viele Referenzen auf Instanz der Klasse B, aber nur einen Verweis auf Instanz der Klasse A, die Sie leicht entfernen können und Garbage Collector wird Instanz der Klasse A sammeln.

Bild zeigt Unterschiede bei der Verwendung von Proxy (Instanz der Klasse B): Jetzt muss nur eine Referenz entfernt werden.

    
Martinsos 10.07.2012 00:16
quelle
0

In den meisten Fällen wird GC es rechtzeitig tun.

Sie können eine Situation haben, in der beispielsweise eine Ansicht ein Modell beobachtet und Sie die Ansicht ablegen, aber das Modell beibehalten möchten. In diesem Fall müssen Sie sich die Observer-Callback-Objekte merken und sie entfernen, wenn Sie die Ansicht disparieren. Sie müssen nicht notwendigerweise spezielle Felder für jeden Beobachter haben - eine Reihe von Aufgaben, die einen Rückruf rückgängig machen, ist in Ordnung. Oder, komplexer gesagt, Sie können eine Schicht transienter Indirektion über dem Modell haben, die aus dem darunter liegenden Modell entspringt. Ich schlage vor, seltsame Dinge mit schwachen Referenzen der einen oder anderen Art zu vermeiden.

Falls Sie Finalisten haben (oder eine Art schwache Kartenräumung benötigen), zum Beispiel vermutlich mit einem java.awt.Frame, möchten Sie vielleicht eine indirekte Ebene zwischen der Ressource und dem Speicher, die einfach sein kann nulled.

    
Tom Hawtin - tackline 10.07.2012 00:42
quelle