2016-08-04 27 views
2

Ich verstehe, dass, wenn ein Objekt zu einer Liste hinzugefügt wird, behält die Liste einen Verweis auf das Objekt basierend auf Antwort von dieser Frage Is this java Object eligible for garbage collection in ListWie mache ich ein Objekt in der Liste für die Garbage Collection geeignet?

Wie dann wie Sie das Objekt in der Liste, die für die Garbage Collection machen so dass es aus dem Heap entfernt wird und keinen Speicher belegt?

Ich frage, weil eine Vbox getChildren Methode in JavaFX beobachtbare Liste zurückgibt, die die Kinder Knoten der Vbox enthält. Wenn ein UI-Element entfernt wird, aber nicht für die Garbage Collection geeignet ist, befindet sich dieses Objekt weiterhin auf dem Heapspeicher?

+1

Ein Artikel wird nur dann für GC verfügbar, wenn kein anderer Artikel darauf verweist. Wenn es in der Liste ist, kann es daher nicht GC'ed sein. Nur wenn es aus der Liste entfernt wird, ist es berechtigt – jr593

+0

Was meinen Sie mit "Wenn ein UI-Element entfernt wird, aber immer noch nicht für die Garbage Collection geeignet ist?" Der einzige Weg, der passiert, ist, wenn es irgendwo andere Referenzen auf das Element gibt. Sobald Sie sie aus der Liste entfernen, enthält die Liste keine Verweise darauf. Wenn Sie also keine anderen Verweise darauf beibehalten, ist die Garbage Collection möglich. –

Antwort

2

Das Entfernen der Referenzen von diesem sollte sie Gegenstand der Speicherbereinigung machen (solange kein anderes Objekt Verweise behält!).

Wissen Sie, das ist die ganze Idee, wie ein GC funktioniert: Er hält die Objekte, die am Leben sind (von Ihrem anfänglichen Ausgangspunkt aus erreichbar). Alles andere ist Müll; und unterliegt der Verfügung, sobald der GC beschließt, diesen Müll zu sammeln. Und um genau zu sein hier: Sie müssen verstehen, dass dies zwei verschiedene Aktivitäten sind. Es kann eine lange Zeit zwischen Objekt X "wird in Müll"; und "X wird gesammelt, und die Erinnerung wird befreit".

Man kann WeakReferences verwenden, um dies zu vermeiden; aber natürlich erfordert dies, dass ein Teil des Codes solche WeakReference-Objekte anfangs in die Liste schieben würde. Wenn Sie also diesen Code "besitzen", können Sie das ändern. Aber natürlich: Das bedeutet, dass Sie immer überprüfen müssen, ob das Objekt hinter der WeakReference immer noch da ist, wenn Sie auf die WeakReference zugreifen.

+0

Ich bin mir ziemlich sicher, dass der OP diesen Code nicht "besitzt": https://docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/VBox.html – fabian

+0

Sicher das OP nicht; aber andere Leute, die meine Antwort lesen, tun es vielleicht. – GhostCat

+0

@James_D Verstanden; aktualisierte meine Antwort. Vielen Dank. – GhostCat

0

Wenn Sie das Objekt nicht aus der Liste entfernen können, wäre die einzige Möglichkeit, dies zu umgehen, das Umschließen Ihrer Objekte in eine WeakReference.

+0

Nicht möglich für Kinder einer 'VBox', da der Typparameter der Liste' Node' nicht 'WeakReference ' ist. – fabian

1

Wie dann wie Sie das Objekt in der Liste, der für Müll Sammlung machen, so dass es aus dem Haufen entfernt ist und Speicher Aufnahme nicht?

Unter der Annahme, dass diese Objekte nur durch diese Liste Bezug genommen wird, verwenden Sie einfach die clear Methode

Wenn ein UI-Element entfernt wird, aber nicht für die Garbage Collection berechtigt, wird dieses Objekt auf dem Heap sein noch Speicher verbrauchen?

Solange ein Objekt durch mindestens ein anderes Objekt verwiesen wird hart worden, dass für die Garbage Collection selbst nicht berechtigt ist, wird der objet sein, sich nicht für die Garbage Collection berechtigt, damit es nicht durch die GC gesammelt wird Es bleibt dann im Heap.