Проверьте увеличение памяти, как советуют другие. Кроме того, вы можете лучше хранить свои данные в таблице, как рекомендует Sbodd и другие.
Однако вы можете столкнуться с фрагментацией памяти. Хеш-карты используют массивы. Большие хеш-карты используют большие массивы. Вы не указываете размер своей хэш-карты, поэтому каждый раз, когда он решает, что он должен быть больше, он отбрасывает свой старый массив и выделяет новый. Через некоторое время ваша память заполнится массивами хеш-таблиц, и вы получите исключение OutOfMemoryException, даже если у вас технически достаточно свободного места. (90% вашей памяти может быть доступно, но кусками слишком мало для использования.)
Сборщик мусора (GC) будет работать непрерывно, объединяя все эти свободные биты в блоки, достаточно большие для использования. Если бы ваша программа работала достаточно медленно, у вас не было бы проблемы, но ваша программа работает на полном наклоне, и сборщик мусора собирается отстать. GC сгенерирует исключение, если не сможет собрать достаточно большой блок достаточно быстро; тот факт, что память существует, не остановит ее. (Это означает, что программа, которую может запустить, не будет работать, но она не позволяет JVM работать очень медленно и выглядеть очень плохо для пользователей.)
Учитывая, что вы знаете, насколько большой должна быть ваша хеш-карта, я бы заранее определил размер. Даже если размер не совсем правильный, он может решить вашу проблему с памятью без увеличения размера кучи и определенно заставит вашу программу работать быстрее (или настолько быстро, насколько позволяет чтение вашего файла - используйте большой файл буферы).
Если вы не знаете, насколько большой может быть ваша таблица, используйте TreeMap. Это немного медленнее, но не выделяет огромные массивы и, следовательно, намного добрее для GC. Я считаю их лот более гибкими и полезными. Вы можете даже взглянуть на ConcurrentSkipTreeMap, который медленнее TreeMap, но позволяет добавлять, читать и удалять из нескольких потоков одновременно.
Но ваша лучшая ставка выглядит примерно так:
hMap = new HashMap<String,ArrayList<String>>( 10000000 );