2016-04-05 7 views
1

Ich erhalte eine GC Overhead Limit überschritten Fehler beim Auffüllen einer Hashmap mit> 100000 Objekte.Architektur: Wie GC overhead Problem beim Auffüllen von Hashmap zu überwinden

Wenn mein Programm startet, liest es aus einer CSV-Datei Schlüssel: Wert-Paare. Es erstellt dann eine Hashmap, die eine Zeichenfolge als Schlüssel und ein Hashset von Objekten für jeden Wert enthält.

Es ist bequem, diese Methode zu behalten, weil ich am Ende Statistiken basierend auf diesen Mappings drucke.

Ich sehe ein paar Optionen: - Reduzieren Sie die Objektgröße. Reduziert das Problem, kann jedoch bei mehr Objekten bestehen bleiben. - Standardkartengröße und Ladefaktor konfigurieren. Das gleiche wie oben. - Erhöhen Sie die Größe des Heapspeichers. Das gleiche wie oben. - Objekte nacheinander bearbeiten und verwerfen. Wird das Problem beheben, verliert jedoch das Mapping von Objekten. - Speicher auf DB abladen?

Sehr schätzen Sie Ihre Gedanken.

+1

Haben Sie schon einen Blick in http://stackoverflow.com/questions/1393486/error-java-lang-outofmemoryerror-gc-overhead-limit-exceeded/? –

Antwort

1

Wenn Sie die Größe des Heapspeichers erhöhen können, wäre das der erste und einfachste Schritt.


Ich würde auch versuchen, die Menge an Müll für den GC zu minimieren, während der ersten Bevölkerung zu sammeln.

Versuchen Sie, die initialSize auf etwas einzustellen, das der erwarteten Größe entspricht. HashMap erzeugt viel Müll während der erneuten Hash/Resize und sollte wenn möglich vermieden werden. Und da HashSet von einem HashMap unterstützt wird, sollten Sie dasselbe mit HashSet tun.

(Auch erwähnenswert, HashMap verdoppelt die Größe, die normalerweise kein Problem, aber wenn Sie eine sehr große Datensatz haben, der nur über einen Resize Schwelle nehmen würde es könnte die doppelte Menge an Speicher benötigt zuteilen.)

Nach HashMap´s javadoc sollten Sie eine InitialSize verwenden, die expectedSize/loadFactor ist, um sicherzustellen, dass keine erneute Hash/Resize passieren wird.


Schließlich (Wenn Sie die Standard loadFactor von 0.75 verwenden, die eine optimale Urspr 33.33333% größer als expectedSize ergäbe), wenn die Speichergröße Anforderungen endet für Ihr Setup ist zu groß auf, der nächste Schritt ist zu sehen Off-Memory-Lösungen wie ein Speicher-Cache von Ehcache, die Sie configure to have a backing persistence storage if the cache takes too much memory können.

Oder wie Sie in Ihrer Frage gesagt haben, eine Datenbank.

Verwandte Themen