Android FinalizerReference с использованием 7 мб оперативной памяти
Я знаю, что есть 2-3 темы по этому поводу, были проблемы с FinalizerReference
, но это все еще не объяснил хорошо. У меня есть вопрос об этом классе и как все в нем работает.
Независимо от того, что я делаю в своем приложении, FinalizerReference
всегда сохраняет 5-10 RAM
для себя, и мой вопрос:
это нормальное поведение, о котором мне не о чем беспокоиться?
Как я знаю, объекты Java освобождаются, но "указатели" остаются в памяти и очищаются с помощью следующего GC (также как и обычные объекты, очищенные с помощью GC, без ссылки на него).
Для меня это немного не так, потому что, если у меня есть ~ 64 МБ ОЗУ для использования с моим приложением и 10 МБ потрачены впустую - должна быть проблема.
Я проверил все это, удалил все утечки, которые у меня были, и в настоящее время мое приложение остается на 18 ~ МБ ОЗУ (7 ОЗУ - графика, 2 ОЗУ - объекты). Остальное - FinalizerReference
; /
Вот скриншот из AppHeap:
вот скрин из этого экземпляра:
и вот мой монитор памяти (он остается в таком виде в течение 30 минут):
Кроме того, на панели "Экземпляры" имеется 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.
После некоторых исследований я нашел этот комментарий, где он сказал, что это может быть вызвано Системой.
Кроме того, я использовал инструмент анализа памяти Eclipse (MAT), который доказал, что многие объекты FinalizerReference
принадлежат системе.
И он не занимал столько памяти, как показал демонстрационный кусок Android Studio.
Ответ 3
Я также столкнулся с этой проблемой, и я создал отдельный вопрос и ответ, прежде чем найти ваш. Я думаю, что я на самом деле добрался до сути.
TL;DR: обработка FinalizerReference, как и любого другого класса при профилировании, приводит к многократному подсчету той же памяти при расчете сохраненного размера. Поэтому в настоящее время вы можете (почти всегда) считать сохраненный размер класса FinalizerReference, о котором сообщает Memory Profiler, бессмысленным.
Поле "referent" в экземпляре FinalizerReference на самом деле должно быть более важным, чем две его ссылки ("prev" и "next") на другие экземпляры FinalizerReference. Только мелкий размер класса должен реально вносить вклад в размер сохраняемой кучи приложения вместе с любыми другими объектами, которые просто ждут завершения() до того, как будут собраны сборщики мусора.
Я рассматриваю это как ошибку в Android Studio Memory Profiler, и подал эту проблему.