Возможная утечка памяти через FinalizerReference

У меня есть небольшое приложение для Android, и я попытался найти утечки памяти, поэтому я нажал "Дамп Java-кучи", а первый класс в списке - FinalizerReference (java.lang.ref). Он имеет более 500 экземпляров, каждый из которых имеет "следующий" и "предыдущий" для другого FinalizerReference.

Я знаю, что FinalizerReference происходит от объектов, которые реализуют Object.finalize(), но у меня нет объекта в моем приложении, которое его реализует. Как я могу узнать, почему эта утечка происходит и исправить?

введите описание изображения здесь

Ответы

Ответ 1

Подробнее о вашей проблеме см. в поле референта вашего Finalizer. Объекты Finalizer просто расширены Reference s, поэтому вы можете исследовать содержимое. Он предоставит вам информацию о завершающих объектах.

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

Приветствия

Ответ 2

Вероятно, в вашем приложении нет утечки памяти, связанной с FinalizerReference, хотя Android Memory Profiler делает его похожим на существующее.

Мои исследования подобных проблем убедили меня в том, что Profiler выполняет массивный многократный подсчет одного и того же небольшого объема памяти в случае FinalizerReference, так что сообщаемое значение сохраненной памяти бессмысленно, а иногда даже смешно.

В вашем случае неглубокий размер ~ 38 кБ важен, но мал, а оставшуюся память ~ 40 МБ следует игнорировать.