Реализации обычно поддерживаются массивами. Массивы - это блоки памяти фиксированного размера. Реализация хэш-карты начинается с хранения данных в одном из этих массивов с заданной емкостью, скажем, 100 объектов.
Если он заполняет массив, и вы продолжаете добавлять объекты, карта должна тайно увеличить размер массива. Поскольку массивы фиксированы, он делает это путем создания совершенно нового массива в памяти вместе с текущим массивом, который немного больше. Это называется ростом массива. Затем все элементы из старого массива копируются в новый массив, а старый массив разыменовывается с надеждой, что он будет собирать мусор и освободить память в какой-то момент.
Обычно причиной такой проблемы является код, который увеличивает емкость карты путем копирования элементов в больший массив. Существуют «глупые» реализации и умные, которые используют коэффициент роста или загрузки, который определяет размер нового массива в зависимости от размера старого массива. Некоторые реализации скрывают эти параметры, а некоторые нет, поэтому вы не всегда можете их установить. Проблема в том, что когда вы не можете установить его, он выбирает некоторый коэффициент загрузки по умолчанию, например 2. Таким образом, новый массив в два раза больше старого. Теперь ваша предположительно карта 50 КБ имеет резервный массив 100 КБ.
Посмотрите, сможете ли вы снизить коэффициент загрузки до 0,25 или около того. это вызывает больше коллизий хеш-карт, что снижает производительность, но вы сталкиваетесь с узким местом в памяти и должны это делать.
Используйте этот конструктор:
(http://java.sun.com/javase/6/docs/api/java/util/HashMap.html#HashMap(int, float))