Sie müssen die Größe Ihrer Daten modellieren, plus den pro Element Overhead von HashMap
, um Ihre Heap-Anforderungen zu bestimmen.
Der Einfachheit halber nehme ich an, dass Sie eine 64-Bit-JVM mit komprimierten OOPS (OOP = gewöhnlicher Objektzeiger) ausführen. Dies ergibt einen 12-Byte-Header pro Objekt und eine 4-Byte-Objektreferenz. Ich gehe weiter davon aus, dass Sie eine HashMap
mit einem Standard-Auslastungsfaktor von 0,75 verwenden.
Bei 10.000 Elementen beträgt die Tabellengröße mindestens 10.000/0.75 = 13.333. Die Tabellengröße ist jedoch immer eine Zweierpotenz, also wird sie wahrscheinlich 16.384 lang sein. Das ergibt 65.536 Bytes - 64 KB.
Jedes in einem HashMap
gespeicherte Elemente erfordert auch die Schaffung eines internen Node
Gegenstand, der vier 4-Byte-Felder (hash, Schlüssel, Wert, next) hat plus 12 Bytes für die Objekt-Header, so dass 28 Bytes pro Node
Objekt . Mit 10.000 Elementen sind das 280KB.
Die HashMap
Tabellengröße plus die internen Node
Objekte erfordern somit 344 KB Overhead zum Speichern von 10.000 Schlüssel-Wert-Paaren. Das führt nicht dazu, dass Ihnen der Speicher ausgeht. Wenn Sie die Anfangskapazität von HashMap
ändern, wird der Kopieraufwand durch die Größenanpassung reduziert, aber die Menge an zusätzlichem temporärem Speicher ist vernachlässigbar im Vergleich zu einer typischen Heap-Größe von Hunderten von MB oder mehreren GB.
Wenn Ihre Heap-Größe 1 GB beträgt und der Speicher bei 10.000 Map-Einträgen knapp wird, benötigt jedes Schlüssel/Wert-Paar etwa 100 KB. Sie können einige Millionen Schlüssel nur dann laden, wenn Sie die Größe des Heapspeichers drastisch erhöhen, oder Sie reduzieren die Größe jedes Schlüssel/Wert-Paars oder eine Kombination aus beiden.
könnten Sie '' initialCapacity' Konstruktor HashMap' verwenden Sie es auf die gewünschte Größe zu setzen, wenn Sie wissen, wie viele Schlüssel Sie im Voraus haben werden. – radoh
Danke für Ihre Antwort. Ich tue es nicht, aber es wird definitiv mehr als der Standardwert von 16 sein. Irgendwo zwischen ein paar tausend und ein paar Millionen. –
können Sie stattdessen TreeMap aus Neugier ausprobieren. Das kann Ihnen helfen, die Art des Problems in der Map-Implementierung zu verstehen. Die Schlüssel müssen die Bestellung auf dem Komparator implementieren. – user1582639