Sobes.tech
Middle+

Как LeakCanary обнаруживает утечку памяти?

sobes.tech AI

AIdan javob

LeakCanary bir necha bosqichda ishlaydi:

  1. Yog‘ilishlarni aniqlash: U Fragment, Activity, View kabi kuzatilayotgan ob’ektlarning hayot aylanishini kuzatadi. Bunday ob’ekt yo‘q qilinadigan bo‘lsa, LeakCanary uni zaif havola (WeakReference) ga joylashtiradi va xotira to‘plovchini ishga tushiradi.
  2. Havolaning mavjudligini tekshirish: Xotira to‘plovchi ishlagach, LeakCanary ob’ektga hali ham havola bor-yo‘qligini tekshiradi. Agar havola hali ham bo‘lsa, bu ob’ekt to‘plangan emas va ehtimol, u yuvilgan.
  3. Xotira dumpi (heap dump): Ehtimoliy yuvilish aniqlanganda, LeakCanary ilovaning xotira dumpini oladi. Bu, ma’lum bir vaqtda ilova ob’ektlari tomonidan egallangan barcha xotiraning suratidir.
  4. Ob’ektlar grafigini tahlil qilish: LeakCanary xotira dumpidagi ob’ektlar grafigini tahlil qiladi va GC ildizlaridan (GC roots) shubhali yuvilish ob’ektigacha bo‘lgan yo‘lni topadi. Bu yo‘l, nima uchun ob’ekt to‘planganini ko‘rsatadi.
  5. Hisobot tayyorlash: Tahlil asosida LeakCanary yuvilish haqida batafsil hisobot tayyorlaydi, bunda ob’ektni ushlab turish yo‘li (ob’ektni ushlab turuvchi ob’ekt, ob’ektga havola qiladi), ob’ekt turi va ehtimoliy yuvilish yuz beradigan kod joyi bo‘ladi. Hisobot bildirishnoma yoki ilova ichida ko‘rsatiladi.
// Ob’ekt A ning yo‘q qilinishidan keyin oddiy kuzatuv misoli
@Override
protected void onDestroy() {
    super.onDestroy();
    // Ob’ektni WeakReference ga o‘rab, LeakCanary ga yuborish
    refWatcher.watch(this);
}

LeakCanary o‘zining parserlari va algoritmlardan foydalanadi, va xotira dump fayllarini (hprof format) tahlil qilib, ob’ektlarni ushlab turish yo‘llarini samarali topadi.