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:
-
Xotira dumpini olish:
- Android Studio Memory Profiler yordamida.
adb shell dumpheap <paket_nomi> /data/local/tmp/dump.hprofkomandasi bilan.- Sistem chaqiruvi
Debug.dumpHprofData(filePath)yordamida.
-
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 Sizega 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.
-
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.