ConcurrentHashMap Speicher-overhead
Weiß jemand, was ist der Arbeitsspeicher-overhead einer ConcurrentHashMap (im Vergleich zu einem "klassischen" HashMap) ?
- Am Bau ?
- Beim einfügen eines Elements ?
- Es macht keinen Sinn große Anzahl von ConcurrentHashMap geben Sie nur eine begrenzte Anzahl von Kernen. Der Aufwand für eine kleine Anzahl von CHM ist wahrscheinlich weniger als 1 Cent Wert-Speicher.
- Ich weiß nicht wirklich den Punkt. "Es ist sinnlos, zu erstellen Sie eine große Menge von ConcurrentHashMap", so what ? Sie haben immer noch einen overhead. Neben, auch wenn es natürlich seltsam, haben viele TMS zur gleichen Zeit, man kann sich leicht vorstellen, dass kurzlebige Objekte erstellen, die eine gleichzeitige hash-map in Ihre Konstruktion (sagen wir mal ein join-operator in einen DB-orientierten software ?).
- Einen Grund, die Sie verwenden könnte, concurrent collections ist, da hast du mehr Kerne als Sammlungen. Wenn Sie viele Sammlungen als Kerne, ist es sehr unwahrscheinlich, dass Sie haben gleichzeitigen Zugriff.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie führen Sie den folgenden mit
-XX:-UseTLAB -XX:NewSize=900m -mx1g
auf einem 64-bit-JVM.bekommen Sie mit Java 6 und 7 für eine million Einträge.
Acht MB Speicher kostet rund 5 Cent.
freeMemory()
weniger präzise.ConcurrentHashMap
nicht wesentlich mehr Speicher alsHashMap
sowohl bei der Konstruktion und bei der insertion.Bei Der Initialisierung
ConcurrentHashMap
verwendet fast die gleiche Menge an Speicher wie eine HashMap, kann etwas mehr für die paar extra-Buchhaltung Variablen und Schlösser.Während der Initialisierung
ConcurrentHashMap
erstellt 16 Segmente zum speichern von Schlüssel-Werte, jedes Segment entspricht einer HashMap.Ersten Kapazität/Größe jedes Segments ist 1/16 der gesamten anfänglichen Kapazität. Damit ist im wesentlichen
ConcurrentHashMap
erstellt 16 kleine HashMaps entspricht einer HashMap. Jedes Segment hat eigenen lock-und paar-Buchhaltung-Variablen (Zähler, Schwellwerte etc.), ist dies extra Speicher-overhead.Können Sie die Anzahl der Segmente, die erstellt von
ConcurrentHashMap
durch die Verabschiedung entsprechender Wert zu concurrencyLevel parameter derConcurrentHashMap
. Kleiner diesen Wert, dann wird weniger Speicherplatz wird verwendet werden, aber mehr Konflikte, wenn eine hohe Anzahl von threads, die Aktualisierung der Karte. Höher dieser Wert, dann mehrere Segmente erstellt werden, aber die performance von parallelen updates werden schneller. Hinweis: Deutlich höhere Wert für concurrencyLevel parameter, wirkt sich sowohl auf Raum und Zeit.Dieser kleine overhead im Speicher ist, was ein Entwickler bereit ist, zu akzeptieren im Austausch für die Parallelität.
An Insertion
Wenn Segmente gefüllt sind, wird die Größe dieses Segments erhöht werden. Die Politik zur Steigerung die Größe ist die gleiche wie die HashMap. loadfactor parameter entscheidet, Wann erhöhen Sie die Größe des Segments. Beachten Sie, dass nur das Segment, welches gefüllt wird, wird erhöht werden. Wieder einmal, Speicher-overhead ist fast genauso wie HashMap.
Insgesamt
ConcurrentHashMap
nicht wesentlich mehr Speicher alsHashMap
, aber es ist wirklich schwer zu Messen und jedes zusätzliche byte verwendetConcurrentHashMap
.Ich nicht wirklich verstehen, die Prämisse in Frage, entweder müssen Sie die Parallelität oder nicht.
Jedoch nach dieser link, den Speicherbedarf eines leeren
ConcurrentHashMap
1700 bytes. Es empfiehlt sich, dass Sie dieConcurrentHashMap
wenn Sie mehrere threads, die lese - /schreib-Zugriff, aber einHashtable
wenn Sie viele threads, die lese-Zugriff aber mit schreiben.