2014-09-29 4 views
-3

Я пытаюсь исправить утечку памяти, что я не понимаю, как это происходит, может быть, с вашей помощью я могу добраться до решения. У меня есть ListFragment и класс FileInfo, который хранит данные для каждого элемента списка. В этом классе FileInfo (это большой, чтобы разместить его здесь) я следующее:Утечка памяти с помощью HashMap на Android

public static final HashMap<String, FileInfo> sFileInfoObjectList = new CacheLinkedHashMap<String, FileInfo>(); 

Я использую этот кэш, так что я не должен строить каждый FileInfo каждый раз. Каждый раз, когда вызывается MyListFragmnet get reloaded FileInfo.getFileInfo (...), если FileInfo находится в кеше, он возвращается, в противном случае создается новый. Как я вижу в DDMS, куча приложения растет каждый раз, когда ListFragment перезагружается. Почему я уверен, что sFileInfoObjectList протекает? Потому что, когда я вызываю sFileInfoObjectList.clear() в методе onDestroy() в ListFragment, кучи не растут. Я также проверил размер sFileInfoObjectList, чтобы узнать, растет ли он, но это не так, поэтому для меня это действительно запутывает.

+2

И мы должны читать ваш ум или заклинать ответ магическим заклинанием? Вы должны показать нам, что вы сделали, по крайней мере, соответствующие части, иначе никто не сможет вам помочь. –

+0

Вы должны использовать свой опыт, чтобы показать другим путь к решению. – David

+0

Как можно найти решение, если никто не знает, в чем проблема? –

ответ

1

Вы указали свое поле как статическое!

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

Решение должно сделать это поле экземпляра, удалив ключевое слово static. Теперь каждый раз, когда экземпляры, имеющие это поле, имеют право на сбор мусора, карта также будет собрана.

И кстати: Не указывайте поля типа карты как «список»!

+0

Я думаю, что @David полностью осознает, что делает «статический», я думаю, что он сделал это специально, потому что он хочет, чтобы «Карта» была «статичной». –

+0

Но он должен быть статичным, это кеш, это глобальный кеш. Я перечисляю, например, файлы в Diredtoy A, для каждого файла в этом каталоге я создаю FileInfo, создавая время загрузки FileInfo, поэтому я помещаю их в кеш. Утечка происходит при перезагрузке Каталога A, я не загружаю другие новые каталоги, поэтому количество элементов в хэш-карте остается неизменным, но куча все еще растет. – David

+0

@ Давид: Тогда Ксавер абсолютно прав. Это плохой вопрос, не указывая нам соответствующую часть вашего кода. Я также проголосую за его закрытие. – Seelenvirtuose

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