OOMMonitor: введение
OOMMonitor — это инструмент для мониторинга утечек памяти в приложениях на Java. Его основной принцип работы заключается в следующем:
- периодически запрашивать информацию о состоянии ресурсов, таких как память кучи, количество потоков и количество дескрипторов файлов;
- при многократном превышении установленного порога или резком быстром превышении высокого порога запускать сбор зеркального изображения.
Сбор зеркальных изображений осуществляется с использованием стратегии «виртуальная машина suspend → fork процесса виртуальной машины → виртуальная машина resume → дамп зеркального образа памяти». Это позволяет сократить время заморозки традиционного дампа с 20 секунд до менее чем 20 миллисекунд.
На основе анализа зеркальных образов с помощью инструмента Shark были внесены ряд изменений для повышения производительности. На мобильных устройствах можно выполнять автономный анализ утечек памяти и поиск ссылочных цепочек, а также создавать аналитические отчёты.
Область применения OOMMonitor
- Android L и выше (API level >= 21).
- Поддерживает архитектуры armeabi-v7a, arm64-v8a, x86 и x86-64.
Подключение к OOMMonitor
Зависимости:
- В файле build.gradle корневого каталога проекта добавьте mavenCentral().
repositories {
mavenCentral()
}
- В файл app/build.gradle проекта добавьте зависимость.
dependencies {
implementation "com.kuaishou.koom:koom-java-leak:${latest_version}"
}
Использование:
- Инициализируйте MonitorManager.
- Инициализируйте OOMMonitor. Можно настроить множество параметров и получить аналитический отчёт.
- Запустите OOMMonitor, чтобы начать периодический мониторинг утечек.
- Обычно не требуется останавливать OOMMonitor вручную.
Для проверки журналов настройте опрос и следите за следующими сообщениями:
- OOMMonitor: startLoop() — начало опроса.
- OOMMonitor_ThreadOOMTracker: [meet condition] overThresholdCount:1, threadCount: 717 — превышение порога.
- OOMMonitor: dumpAndAnalysis — запуск сбора зеркального образа для анализа.
- OOMMonitor: end hprof dump — завершение сбора зеркального образа.
- OOMMonitor: start hprof analysis — начало анализа зеркального образа.
- OOMMonitor: heap analysis success, do upload — анализ зеркального образа завершён успешно, можно загрузить результаты.
Часто задаваемые вопросы об OOMMonitor
Как влияет OOMMonitor на производительность?
- Сбор зеркальных образов больше не блокирует выполнение основного процесса, поэтому этим влиянием можно пренебречь.
- Время, затрачиваемое на сбор зеркальных образов и их анализ дочерним процессом, может достигать трёх минут и более, что занимает один поток. Объём используемой памяти обычно составляет менее 200 МБ.
- Рекомендуется использовать удалённый механизм переключения, который позволяет выборочно активировать сбор данных.
Как определяется утечка?
- Для Activity и Fragment, если объект уже уничтожен, но всё ещё имеет ссылку на него из GC Root, считается, что объект просочился.
- Правила определения уничтожения Activity: mFinished или mDestroyed равно true.
- Правила определения уничтожения Fragment: mFragmentManager пуст и mCalled равно true, где mCalled указывает, что фрагмент прошёл через некоторые жизненные циклы.
Как обрезать зеркальный образ?
Используйте ForkStripHeapDumper.getInstance().dump(path).
Как восстановить обрезанный зеркальный образ, чтобы AS Profiler/MAT мог его открыть?
- Получите обрезанный зеркальный образ.
adb shell "run-as com.kwai.koom.demo cat 'files/test.hprof'" > ~/temp/test.hprof
- Используйте koom-fill-crop.jar для восстановления обрезанного зеркального образа.
java -jar koom-fill-crop.jar test.hprof
Как понять ссылочные цепочки в аналитическом отчёте?
- Сначала ознакомьтесь с комментариями в HeapReport.java.
- Ссылка: за исключением массивов, все они состоят из комбинации имени класса и имени поля, где поле принадлежит этому классу и содержит ссылки. Ссылочная цепочка представляет собой отношение, в котором объект верхнего уровня в цепочке владеет экземпляром этого поля или объявлением статического поля.
- ReferenceType: представляет тип ссылки, который может быть одним из следующих:
- INSTANCE_FIELD: ссылка на экземпляр обычного поля. Обычно это новый объект, назначенный через знак равенства.
- ARRARY_ENTRY: ссылка на элемент массива.
- STATIC_FIELD: ссылка на статическое поле класса.
- DeclaredClass: поле не обязательно объявлено непосредственно в классе. Поле также может быть унаследовано от родительского класса. DeclaredClass представляет класс, которому принадлежит это поле.
Как анализировать и объединять запутанные классы в отчётах?
- Эта часть кода не является открытой. Рекомендуется обратиться к APM бэкэнду каждой компании.
- Деобфускацию можно выполнить с помощью функции ReTrace инструмента progurad.
Опубликовать ( 0 )