Требуется массаж кучи Android

#java #android #memory #heap-memory

#java #Android #память #куча-память

Вопрос:

Я пытаюсь загрузить сохраненную игру в свое приложение. Проблема в том, что я продолжаю сталкиваться со следующей проблемой:

  06-01 00:42:36.123: ERROR/dalvikvm-heap(10297): Heap Massage needed (5107596-byte    
   external allocation too big)

 06-01 00:42:36.123: ERROR/dalvikvm-heap(10297): -->Full GC (don't collect 
       SoftReferences)

 06-01 00:42:36.163: ERROR/dalvikvm-heap(10297): -->Heap Massage was successful...
  

Мне кажется, я знаю почему. Текущая игра (которую я хочу удалить и забыть) все еще сохраняет память. Я хочу «разблокировать» эту память, так есть ли какой-нибудь способ, которым я могу сделать «дамп кучи» (используются кавычки, поскольку я новичок и, вероятно, использую неправильные технические слова)?

Комментарии:

1. У вас где-нибудь загружена глобальная карта текстур (или что-нибудь еще, я полагаю)? Если это так, вы, вероятно, захотите использовать WeakReferences в этой карте…

2. У меня нет ничего подобного. У меня есть surfaceview с несколькими большими растровыми изображениями.

Ответ №1:

Как только вы устраните все ссылки на ваши текущие игровые данные (установив все соответствующие переменные, записи хэша и т.д. в null ), Вы можете вызвать System.gc() (или Runtime.getRuntime().gc() ), чтобы предложить JVM, что это подходящее время для сборки мусора. Однако обратите внимание, что вы не можете принудительно выполнить сборку мусора таким образом.

Комментарии:

1. Спасибо за совет! Вызов коллекции Gerbage, похоже, не помогает.

2. Иногда бывает трудно отследить все ссылки на данные, которые необходимо освободить. До тех пор, пока существует единственная действующая ссылка, данные не будут восстановлены GC. В статье Предотвращение утечек памяти рассматривается ряд проблем, характерных для Android.