-
Notifications
You must be signed in to change notification settings - Fork 60
Description
Подскажите пожалуйста, что можно сдеалать с такой проблемой?
Утечка нативной памяти при возврате к фрагменту с MapView
Описание: В приложении используется фрагмент с MapView. При переходе с этого фрагмента на следующий экран и последующем возврате обратно наблюдается постепенное увеличение потребления нативной памяти. Даже после запуска сборщика мусора (GC) память не освобождается полностью.
В демонстрационном примере рост памяти незначителен, но в реальном проекте, где на карту добавляются объекты (маркеры, полигоны и т.д.), увеличение становится существенным и в конечном итоге приводит к крашу приложения из-за нехватки памяти.
https://github.com/Kudlayra/MapLeak
🔁 Шаги для воспроизведения:
1. Открыть приложение
2. Запустить профайлер памяти в Android Studio
3. Нажать кнопку "Next" для перехода на следующий экран
4. На новом экране нажать кнопку "Previous" для возврата к фрагменту с MapView
5. Повторить шаги 3 и 4 многократно, наблюдая за графиком нативной памяти(20-30 раз достаточно, чтобы увидеть прирост в потреблении памяти)
📊 Ожидаемое поведение:
После возврата к фрагменту с MapView нативная память должна освобождаться корректно, без накопления.
🧪 Фактическое поведение:
Память постепенно увеличивается, GC не очищает ее полностью. Если первом открытии расходуется 50 мб, то после многократного возврата к экрану с MapView можно получить краш от нехватки памяти.
Если экран с картами убрать полностью из стэка навигации, то память зачищается почти полностью при запуске GC.
Пока что исправил эту проблему вызовом у родительского контейнера, в котором находится MapView, метод removeAllViews() в колбэке onDestroyView() фрагмента.
