Android FinalizerReference с использованием 7 мб оперативной памяти

Я знаю, что есть 2-3 темы по этому поводу, были проблемы с FinalizerReference, но это все еще не объяснил хорошо. У меня есть вопрос об этом классе и как все в нем работает.

Независимо от того, что я делаю в своем приложении, FinalizerReference всегда сохраняет 5-10 RAM для себя, и мой вопрос:

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

Как я знаю, объекты Java освобождаются, но "указатели" остаются в памяти и очищаются с помощью следующего GC (также как и обычные объекты, очищенные с помощью GC, без ссылки на него).

Для меня это немного не так, потому что, если у меня есть ~ 64 МБ ОЗУ для использования с моим приложением и 10 МБ потрачены впустую - должна быть проблема.

Я проверил все это, удалил все утечки, которые у меня были, и в настоящее время мое приложение остается на 18 ~ МБ ОЗУ (7 ОЗУ - графика, 2 ОЗУ - объекты). Остальное - FinalizerReference ; /

Вот скриншот из AppHeap: enter image description here

вот скрин из этого экземпляра:

enter image description here

и вот мой монитор памяти (он остается в таком виде в течение 30 минут):

enter image description here

Кроме того, на панели "Экземпляры" имеется 50 записей, включая ~ 5 из моего кода и библиотек, которые я использую. Остальное от Android - InputManager, Parcels, Proxies и т.д.

редактировать

Это происходит на Galaxy S5. В эмуляторе Android я получаю ~ 2 МБ от FinalizerReference

Ответ 1

Я не решил проблему, но получил совет, что я должен проверить пустой проект.

Пробовал:

  • Android Studio Windows x32
  • Android Studio Windows x64
  • IntelliJIDEA x32
  • IntelliJIDEA x64

Все это заставляет FinalizerReference хранить 5-10 mb RAM для себя, в пустых и непустых проектах.

Просто игнорируйте проблему и продолжайте писать код.

Ответ 2

У меня была та же проблема с FinalizerReference, только на Nexus 5.

Вот скриншот кучи кучи из Android Studio. enter image description here

После некоторых исследований я нашел этот комментарий, где он сказал, что это может быть вызвано Системой.

Кроме того, я использовал инструмент анализа памяти Eclipse (MAT), который доказал, что многие объекты FinalizerReference принадлежат системе.

И он не занимал столько памяти, как показал демонстрационный кусок Android Studio.

enter image description here

Ответ 3

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

TL;DR: обработка FinalizerReference, как и любого другого класса при профилировании, приводит к многократному подсчету той же памяти при расчете сохраненного размера. Поэтому в настоящее время вы можете (почти всегда) считать сохраненный размер класса FinalizerReference, о котором сообщает Memory Profiler, бессмысленным.

Поле "referent" в экземпляре FinalizerReference на самом деле должно быть более важным, чем две его ссылки ("prev" и "next") на другие экземпляры FinalizerReference. Только мелкий размер класса должен реально вносить вклад в размер сохраняемой кучи приложения вместе с любыми другими объектами, которые просто ждут завершения() до того, как будут собраны сборщики мусора.

Я рассматриваю это как ошибку в Android Studio Memory Profiler, и подал эту проблему.