Управление памятью Java с помощью HashMap - PullRequest
2 голосов
/ 20 августа 2011

Я работаю над приложением, которое считывает огромное количество данных из базы данных в Map<String,Map<String,Map<String,String>>>, обрабатывает его и записывает обработанные отчеты в электронную таблицу с помощью собственного средства записи XML.Весь прогон может занять около 12 часов.

Я обнаружил, что получаю

Exception in thread "CursorController-Thread-0" java.lang.OutOfMemoryError: Java heap space
    at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45)
    at java.lang.StringBuilder.<init>(StringBuilder.java:68)

Когда я пытаюсь написать этот большой файл.По этой причине я думаю, что было бы лучше написать каждый Map<String,Map<String,String>> (обратите внимание, что это слой глубже), поскольку он завершил обработку.

Мой вопрос, как я могу убедиться, что Map<String,Map<String,String>> не сохраняетсяв памяти после того, как я это напишу, так как Карта >> все еще будет содержать его?

Ответы [ 5 ]

7 голосов
/ 20 августа 2011

Как только вы закончите с Map<String,Map<String,String>>, сопоставленным клавише "key", вы просто выполните

hugeMap.remove("key");

Это приведет к «обнулению» записи в hugeMap и предоставит Map<String,Map<String,String>> право на сборку мусора (т. Е. Никогда не будет частью создания пространства кучи из памяти).

2 голосов
/ 20 августа 2011

Я бы выбрал другое решение для такого рода проблем.12 часов на обработку исходных данных - это тяжело.

Рассматривали ли вы какие-либо масштабируемые решения?Например, Hadoop?

0 голосов
/ 20 августа 2011

Вы можете сохранить карту>, которая была написана на внешней карте, если вы хотите сохранить свою структуру.но, вероятно, вы должны очистить его содержимое так, чтобы оно было пустым.Кроме того, убедитесь, что когда вы обрабатываете и пишете его, вы нигде не сохраняете ссылки на его элементы (отображения) до очистки содержимого.пожалуйста, смотрите следующий пост, чтобы выбрать подход, который наилучшим образом соответствует вашим потребностям Использование .clear () или разрешение GC позаботиться об этом

0 голосов
/ 20 августа 2011

Используйте map.remove(key) метод на вашем Map>>.Вы можете время от времени звонить System.gc();, чтобы форсировать сборку мусора.

0 голосов
/ 20 августа 2011

Вы не можете.

Сборщик мусора запускается, когда ему нравится, и освобождает все, что ему нравится.

Тем не менее стоит попробовать, чтобы после удаления всех ссылок на данные, которые вам больше не нужны, позвоните по номеру System.gc().

В любом случае, вы написали, что при записи данных произошла ошибка нехватки памяти. Может быть, у вас там утечка памяти.

...