Использование:
Типичный сценарий:
Memory Profiler → Record allocations → Force GC → Analyze
Особенности:
Пример настройки:
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
}
Что обнаруживает:
Для сложных случаев:
Процесс работы:
adb shell am dumpheap <PID> /data/local/tmp/heap.hprof
hprof-conv heap.hprof converted.hprof
Быстрый анализ:
class Singleton(context: Context) {
// Плохо: удерживаем контекст активности
private val badContext = context
// Хорошо: использовать applicationContext
private val goodContext = context.applicationContext
}
class MyActivity : AppCompatActivity() {
private val listener = { /*...*/ }
override fun onCreate() {
someObject.setListener(listener) // Утечка активности
}
// Решение: WeakReference или явная отписка
}
object ViewHolder {
var dangerousView: View? = null // Удерживает всю иерархию
}
class SafeReference(activity: Activity) {
private val weakRef = WeakReference(activity)
fun doSomething() {
weakRef.get()?.let { activity ->
// Безопасная работа с активностью
}
}
}
@RunWith(AndroidJUnit4::class)
class MemoryLeakTest {
@Test
fun checkActivityLeak() {
val scenario = launchActivity<MainActivity>()
scenario.recreate() // Эмулируем поворот экрана
scenario.onActivity { activity ->
assertFalse(isObjectRetained(activity))
}
}
}
Правила работы с Context:
Жизненный цикл компонентов:
Паттерны проектирования:
Для эффективного поиска утечек памяти в Android требуется комбинация инструментов - LeakCanary для автоматического обнаружения, Memory Profiler для интерактивного анализа и MAT для глубокого исследования сложных случаев. Профилактика утечек должна быть частью ежедневной практики разработки через соблюдение правил работы с контекстом и жизненным циклом компонентов.