Вам необходимо смоделировать размер ваших данных, а также накладные расходы на один элемент HashMap
, чтобы определить ваши требования к куче.
Для простоты предположим, что вы используете 64-битную JVM с использованием сжатого OOPS (OOP = обычный указатель объекта). Это дает 12-байтовый заголовок для каждого объекта и 4-байтовый объект. Я также предполагаю, что вы используете HashMap
с коэффициентом загрузки по умолчанию 0,75.
С 10 000 элементов размер стола составляет не менее 10 000/0,75 = 13,333. Однако размер таблицы всегда равен двум, поэтому, вероятно, будет 16,384. Это дает 65536 байт - 64 КБ.
Каждый элемент хранится в HashMap
также требует создания внутреннего Node
объекта, который имеет четыре 4-байтовых полей (хэш, ключ, значение, рядом) плюс 12 байт для заголовка объекта, что дает 28 байт в Node
объекта , С 10 000 элементов, это 280 КБ.
Размер стола HashMap
, а также внутренние объекты Node
требуют, чтобы накладные расходы составляли 344 КБ для хранения 10 000 пар ключ-значение. Это не вызывает у вас нехватки памяти. Изменение начальной емкости HashMap
приведет к уменьшению затрат на копирование при изменении размера, но объем временной дополнительной памяти, которую он занимает, пренебрежимо мал по сравнению с типичным размером кучи сотен МБ или нескольких ГБ.
Если размер вашей кучи составляет 1 ГБ, а у вас заканчивается память на 10000 записей карты, то каждая пара значений ключа принимает около 100 КБ. Вы не сможете загрузить несколько миллионов ключей, если вы не увеличите размер своей кучи, или уменьшите размер каждой пары значений ключа или какую-то комбинацию обоих.
Вы можете использовать конструктор 'InitialCapacity'' HashMap', чтобы задать желаемый размер, если вы знаете, сколько ключей у вас будет. – radoh
Спасибо за ваш ответ. Я не знаю, но это определенно будет больше, чем дефолт 16. В любом месте от нескольких тысяч до нескольких миллионов. –
вы можете попробовать TreeMap вместо этого, из любопытства. Это может помочь вам понять, является ли характер проблемы в реализации Карты. Ключи должны реализовывать порядок на компараторе. – user1582639