Java-hashmaps und memory leaks
Ich habe eine Konsole Java-Anwendung, die einige Daten aus der Datenbank. Da die Anwendung ständig läuft, alle 30 Sekunden, zu senken, um die Belastung der DB verwende ich eine Art cache für die Daten.
Weil es nicht eine große Menge der benötigten Daten in der Datenbank, ich bin mit der singleton-Hashmap als mein cache. Mein cache-Klasse sieht wie folgt aus:
public class Cache extends Hashmap<Integer, Hashmap<Integer, ArrayList<String>> {
//some code
}
Alle 5 Minuten system wird der cache aktualisiert von:
1) Aufruf von "clear()" für die vorhandenen Daten
2) füllen den cache mit neuen Daten aus der db.
Sagen Sie mir, wenn ich die "clear()" für die Struktur, die ich habe ("nested" hashmaps) Java deaktivieren Sie alle Daten containd unter meinem cache-keys, oder werde ich am Ende mit Speicherlecks?
Es löst die key/value-Objekte in der map, sondern hält die backing-array/Tabelle.
Klingt wie ein memory leak. Haben Sie sorgte dafür, dass alle relevanten db-bezogene Objekte dont beziehen sich auf Elemente in Ihrem hashmaps? ...z.B.
ResultSet
uswInformationsquelleAutor guest86 | 2013-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies tun, aber ich schlage vor, eine bessere alternative ist, um es zu ersetzen. Dies wird effektiver sein, wenn Sie mehrere threads.
Dies ist thread-safe und hat ein minimum von Auswirkungen.
ConcurrentHashMap
? Scheint, wie es hätte sein müssen, zu halten, die thread-sicher.Sie brauchen nur einen ConcurrentMap wenn Sie Lesen und schreiben. In diesem Fall ist es nur zu schreiben und nach einem synchronisierten block, nur Lesen. Nicht mehr sperren/thread-Sicherheit erforderlich ist.
Ah ich sehe, Sie schreiben nur auf der Karte wie bauen Sie es aus der Datenbank und dann wickeln Sie es vielleicht in einem
unmodifiableMap
. Allerdings müssen Sie nicht setzen sich zu einem memory-leak-problem? Wenn Benutzern das zuweisen der Referenz zurückgegebengetMap()
einige variable, dann wird Sie nicht bekommen GCed nachupdateCache
.Sie sollte keine
getMap()
Methode. Mit dem Prinzip der Kapselung, die Sie ausblenden möchten, die genaue Umsetzung mit einer Karte. Die cache-Klasse sollte doch lieber etwasget(Integer key)
Methoden auf die Daten zugreifen.aber könnte es
getList(int key1, int key2)
oder sogar Besucher für die Elemente der Liste.InformationsquelleAutor Peter Lawrey
Dieser Artikel ist hilfreich für Sie.
Ist Java-HashMap.clear() und remove() Speicher effektiv?
Und HassMap ist nicht thread-sicher.
Wenn Sie möchten, dass Sie Nutzung des singleton-HashMap, es wäre besser, verwenden ConcurrentHashMap.
InformationsquelleAutor Dohyun Jung