Reduzieren Sie Speichernutzung Mit WeakHashMap
-
20-09-2019 - |
Frage
In der Javadoc von WeakHashMap.html , sagte er
"Jedes Schlüsselobjekt in einem WeakHashMap ist indirekt als Bezugspunkt eines gespeicherten schwache Referenz. Daher wird ein Schlüssel automatisch nur entfernt werden, nachdem die schwachen Verweise darauf, sowohl innerhalb und außerhalb der Karte, haben vom Garbage Collector gelöscht. "
Und dann
Beachten Sie, dass ein Wertobjekt beziehen indirekt auf seine Schlüssel über die WeakHashMap selbst; Das heißt, ein Wert Objekt kann stark auf einige verweisen andere Schlüssel-Objekt, dessen zugehörige Wertobjekt, das wiederum bezieht sich stark auf den Schlüssel des ersten Wertobjekt.
Aber nicht beiden Schlüssel und Wert sollen schwachen Verweis in WeakHashMap verwendet werden? das heißt, wenn es nicht genügend Arbeitsspeicher ist, GC wird der Speicher durch das Wertobjekt gehalten frei (da die meisten der Wert Objekt mit hoher Wahrscheinlichkeit mehr Speicher als Schlüsselobjekt in den meisten Fällen nehmen)?
Und wenn GC den Objektwert freizugeben, kann das Schlüsselobjekt als auch frei sein?
Im Grunde bin ich für eine HashMap suchen, die Speichernutzung reduzieren, wenn es wenig Speicher ist (GC sammelt den Wert und die Schlüsselobjekte falls erforderlich).
Ist es möglich, in Java?
Danke.
Lösung
sind schwache Verweise ungeeignet für Caches - NetBeans tut es, und dumm gehen
. SoftReference
ist das, was Sie wollen. Es ist eigentlich ziemlich schwierig, es richtig zu machen - so jemand andere Lösung kopieren. Einige Leute raten ausdrücklich Verwaltung Caches selbst.
Reference
s nur mit einer einzigen Referenz arbeiten. Es gab zu Java SE ein Vorschlag für das Hinzufügen von „ephemerons“, aber ich habe nicht eine Implementierung geht überall mit gesehen.
Andere Tipps
Die Idee ist, dass Sie diese Karte als „Lookup“ Datenstruktur verwenden, die nur die Schlüssel-Wert-Paare am Leben hält, die noch zu (über einen Schlüssel) verwiesen werden können. Dennoch, während die Grundidee ist schön, ich erinnere mich, dass es nicht so nützlich war, wie ich es sein würde, gehofft.