Sobes.tech
Middle+

Dumpni tahlil qilishda xotira oqishini qanday aniqlash mumkin?

sobes.tech AI

AIdan javob

Xotira qilish uchun xotira dumpi (HPROF fayli) ichida obyektlar grafigini tahlil qiladigan asboblar ishlatiladi. Asosiy bosqichlar:

  1. Xotira dumpini olish:

    • Android Studio Memory Profiler yordamida.
    • adb shell dumpheap <paket_nomi> /data/local/tmp/dump.hprof komandasi bilan.
    • Sistem chaqiruvi Debug.dumpHprofData(filePath) yordamida.
  2. Dumpni tahlil qilish:

    • Android Studio'da dumpni ochish: Memory Profiler yoki "File" -> "Open" menyusi orqali.
    • Ob'ektlarni tahlil qilish: Ob'ektlarni hajmiga (Shallow Size, Retained Size) va nusxa soniga qarab saralash.
    • Shubhali ob'ektlarni qidirish: Klasslar, ularni yo'q qilish kerak bo'lgan (masalan, Activity, Fragment, Contexts) lekin ko'p nusxalar yoki katta Retained Size ga ega bo'lgan.
    • Ob'ektga bo'lgan yo'lni o'rganish (Reference Chain): Shubhali ob'ektni tanlang va uning GC roots ga bo'lgan yo'lini izohlash. Bu, kimning referensiya tutayotganini ko'rsatadi va axlat yig'ishni oldini oladi.
    • Statik referensiyalarni qidirish: Statik maydonlar, agar uzoq umr ko'radigan referensiyalarni saqlasa, odatda, muammo manbai bo'ladi.
    • LeakCanary'dan foydalanish: Kutubxona, sızıntılarni aniqlash, dump qilish va real vaqt tahlil qilishni avtomatlashtiradi va sızıntı yo'li haqida batafsil tavsif beradi.
  3. Natijalarni talqin qilish:

    • GC root ga uzun yo'l, va u yerda o'lik bo'lishi kerak bo'lgan ob'ektlarga bo'lgan referensiyalar muammo borligini ko'rsatadi.
    • Statik maydonlar, AsyncTask, Handler'lar kechikish bilan, to'g'ri ro'yxatdan o'tkazilmagan listenerlar/callbacklar yoki singletonlar, odatda, sızıntılarning sababi bo'ladi.

Android Studio Memory Profiler'da GC root yo'li tahlili misoli:

// Sızıntı ko'rsatadigan GC root yo'li misoli
// android.app.Activity instansiyasi mDestroyed=true bilan
//   android.widget.LinearLayout ga referensiya
//     android.view.View $ListenerInfo ga referensiya
//       com.example.MyActivity$1 (View.OnClickListener ni amalga oshiradigan anonim klass)
//         com.example.MyActivity ga referensiya (sızıntı)

Bu misolda, anonim klass (tugma bosish tinglovchisi) MyActivity ga noaniq referensiya tutadi, holbuki faoliyat allaqachon o'lik bo'lishi kerak (mDestroyed=true). Bu tinglovchi, ehtimol, boshqa uzoq umr ko'radigan ob'ekt (masalan, statik maydon yoki singleton) tomonidan ro'yxatdan o'tkazilgan yoki ushlab turilgan bo'lishi mumkin.