2015-02-09 4 views
3

Так что у меня здесь есть java-программа, которая манипулирует огромным количеством данных и хранит их в объектах (главным образом хэш-карты). В какой-то момент времени данные становятся бесполезными, и мне нужно отказаться, чтобы я мог освободить память.Как очистить объекты (HashMap) для сбора мусора - Java

Вопрос в том, что было бы лучшим поведением, чтобы отбросить эти данные для сбора мусора?

Я пробовал map.clear(), однако этого недостаточно, чтобы очистить память, выделенную картой.

EDIT (Для добавления альтернативы я пробовал)

Я также попробовал System.gc(), чтобы заставить сборщик мусор бежать, однако это не помогло

+1

память не очищается, то объекты становятся без ссылок. Сбор мусора происходит, если вашей программе требуется больше памяти, она недоступна, а затем запускается GC и восстанавливает все объекты без ссылок. Для некоторых Java-программ вполне возможно, что GC никогда не происходит во время выполнения программы, так как не требуется больше памяти. – Mnementh

+0

«этого недостаточно, чтобы очистить память, выделенную картой». Как вы пришли к такому выводу? – Thilo

ответ

9

HashMap # ясной воли выкинуть все записи из HashMap, но it will not shrink it back to its initial capacity. Это означает, что у вас будет пустой массив поддержки (в вашем случае, я думаю), пробел для десятков тысяч записей.

Если вы не собираетесь повторно использовать HashMap (с примерно одинаковым объемом данных), просто выбросьте весь экземпляр HashMap (установите его на null).

В дополнение к вышесказанному:

  • если записи на карте до сих пор ссылаются некоторые другие части вашей системы, они не будут собираться в качестве мусора, даже если они будут удалены с карты (потому что они необходимы в другом месте)
  • Сбор мусора происходит в фоновом режиме и только тогда, когда это необходимо. Таким образом, вы не можете сразу увидеть, как много свободы освобождается, и это может и не быть проблемой.
+1

Имеет смысл. Даже утечка ссылок на * экземпляр ввода * (если таковой имеется) не повлияет на производительность. +1 :) – TheLostMind

+1

Из этого следует, что если вы используете хэш-карту с большим количеством записей, а затем в программе, она становится меньше (несколько записей), но все еще используется, вероятно, она должна быть скопирована на новую HashMap с конструктор копирования, а не вокруг. Правильно? – RealSkeptic

+0

Я не знаю ... Обычно программы имеют какое-то требование рабочей памяти, освобождая некоторую память, которая понадобится снова через несколько минут, не кажется большой победой. Даже освобождение памяти, которая никогда не используется снова, может никому не приносить пользу. Я бы не стал беспокоиться об этих вещах, если я не работаю с действительно огромными коллекциями. И если это так, возможно, в любом случае вызывается более полное решение (например, хранилище без кучи). – Thilo

4
system.gc() 

не рекомендуется, так как JVM должна быть только один, чтобы заботиться о всех сбора мусора. Используйте Class WeakHashMap<K,V> в этом случае. объекты будут автоматически удалены, если ключ уже не действует

Please read this link for reference

+1

Откуда вы знаете, что здесь уместна карта WeakHashMap? – Thilo

+0

Я рад ...Почему люди не поддержали этот ответ? Я думаю, что WeakHashMap идеально подходит для таких ситуаций. Не правда ли? Может кто-нибудь, пожалуйста, обсудите это? –

Смежные вопросы