2016-08-08 31 views
0

Ich habe einige Objekte in einer Hashmap. Diese Objekte enthalten Bytepuffer. Jetzt möchte ich, dass diese Bytestuffs freigegeben werden. Wenn ich also nur die hashmap-Referenz null mache, werden all diese Objekte aktiviert, die bereit sind, Garbage Collected und Buffer zu befreien. oder ich muss all diese Nullen explizit machen.Wie können Objekte aktiviert werden, damit sie gesammelt werden?

+0

Es sollte im Allgemeinen keine Möglichkeit geben, ein Objekt von Ihrem Code abzurufen, um Garbage Collected zu sein. Also sollte es ausreichen, den Hash-Verweis auf null zu setzen, damit ganze Elemente freigegeben werden. –

Antwort

0

Wenn in Ihrem Programm nirgendwo ein Verweis vorhanden ist, werden die Objekte, die zur Sammlung von Daten bereit sind, gesammelt. Die Zeit, in der das passiert, hängt stark vom verwendeten Garbage Collector ab.

1

Grundsätzlich kommt es auf Erreichbarkeit. Wenn ein Objekt nicht über eine Kette von (normalen) Referenzen erreicht werden kann, die von etwas ausgehen, das Sie in Ihrem Code haben (a -> b -> c, wo Sie a haben), dann ist es für GC geeignet. Wenn du kannst, dann ist es nicht. Sobald sich nichts mehr auf Ihr Objekt bezieht, ist der Bytepuffer für GC geeignet, da er nicht erreichbar ist.

Ich habe einige Objekte in einem Hashmaps.

Ich gehe davon aus, dass sie die Werte und nicht die Schlüssel sind. (Das ist nur in Hinblick darauf, ob Sie den Eintrag aus der HashMap entfernen oder stellen Sie einfach den Wert für den Schlüssel zu null.)

dafür Also, wenn ich machen gerade die hashmap Referenz null wird es all diese Objekte ermöglichen bereit, den Müll zu sammeln und Puffer zu befreien. oder ich muss all diese Nullen explizit machen.

Sie müssen nur Ihr Objekt freigeben, zum Beispiel, entfernen Sie den Eintrag aus der HashMap ganz oder setzen Sie den Wert des Eintrags auf null, die die HashMap ‚s Verweis auf das Objekt freigeben wird. Wenn dies der einzige Verweis auf Ihr Objekt ist, wird Ihr Objekt für GC zugelassen. Wenn Ihr Objekt das einzige Objekt mit Bezug auf den Bytepuffer ist, wird es auch für GC geeignet. Sie müssen den Verweis auf den Bytepuffer in Ihrem Objekt nicht explizit freigeben.

-Code ist 1024 Wörter wert, also:

class Thingy { 
    private byte[] buffer; 

    MyObject() { 
     this.buffer = new byte[1024]; 
    } 
} 

In anderen Ländern:

Map<String, Thingy> m = new HashMap<>(); 

m.put("foo", new Thingy()); 
// At this point, the HashMap refers to the Thingy, and the Thingy refers to the 
// buffer, so neither of them is eligible for GC 

m.remove("foo"); // or m.put("foo", null) if that's really appropriate 
// At this point, nothing refers to the Thingy anymore, and so both the Thingy and 
// its buffer are eligible for GC 

Java hat das Konzept der weak references, die eine Ausnahme von dieser Regel sind. Sie erlauben es, ein Objekt zu erfassen, selbst wenn das Objekt aus dem WeakReference herausgelesen werden konnte, das sie enthält (an diesem Punkt ist es über das WeakReference nicht mehr erreichbar).

+0

sollten Sie das Konzept der GC-Wurzeln erwähnen. Pfade in einem Graphen zu analysieren, macht nur Sinn, wenn Sie einen Startpunkt haben – the8472

0

Ja, sie werden Müll gesammelt werden, es sei denn, Sie haben andere Verweise auf sie (wahrscheinlich Handbuch). Wenn Sie nur einen Verweis auf die Karte haben, dann werden sie Müll gesammelt.

Meine Gedanken:

Wenn ich rufe: myMap = null; Was passiert wirklich mit den verwandten Hashmap-Schlüsseln oder -Werten in der Map? Werden sie auch Müll gesammelt, oder ich muss alle verwandten Objekte im myMap-Objekt auf Null setzen?

Nehmen wir an, dass myMap einige Schlüssel und Werte enthält, die für einige andere Objekte noch erreichbar sind. Dann

  • Nichts passiert sofort.
  • Wenn diese Schlüssel und Werte nur über die Karte erreichbar sind, sind sie jetzt nicht mehr erreichbar und für die Garbage Collection geeignet. (In diesem Fall ist die Zuweisung von Null zu Referenzen auf interne Objekte nicht erforderlich.)
  • Wenn die internen Knoten jedoch über andere Pfade erreichbar waren, sind sie vermutlich immer noch erreichbar und daher NICHT für die Garbage Collection geeignet. und wenn Sie die Karte als null setzen, wird auch kein Müll gesammelt.