Sobes.tech
Middle+

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

sobes.tech AI

პასუხი AI-სგან

LeakCanary бірнеше кезеңде жұмыс істейді:

  1. Ағып кетуді анықтау: Ол бақылап отырған объектілердің, мысалы, Fragment, Activity, View, өмірлік циклін қадағалайды. Мұндай объект жойылған кезде, LeakCanary оны әлсіз сілтеме (WeakReference) ішіне орналастырады және қоқыс жинағышты іске қосады.
  2. Сілтеменің бар-жоғын тексеру: Қоқыс жинағыш іске асқаннан кейін, LeakCanary объектке әлі де сілтеме бар-жоғын тексереді. Егер бар болса, бұл объект жиналмағанын және мүмкін, ағып кету болғанын білдіреді.
  3. Жадты шығару (heap dump): Мүмкін болатын ағып кетуді анықтағанда, LeakCanary қолданбаның жадын шығарады. Бұл белгілі бір уақытта қолданбаның объектілері иеленген барлық жадының суреті.
  4. Объектілер графигін талдау: LeakCanary жад шығаруындағы объектілер графигін талдайды және GC түбірлерінен (GC roots) күдікті ағып кететін объектіге дейінгі жолды табады. Бұл жол объекті жиналмағанын көрсетеді.
  5. Есепті құру: Талдауға негізделген, LeakCanary ағып кету туралы егжей-тегжейлі есеп құрады, оның ішінде объектіні ұстау жолы (ұстаушы объект ұстаған объектке сілтеме жасайды), объект түрі және кодтағы орын, онда, мүмкін, ағып кету орын алған. Есеп хабарлама немесе қолданба ішінде көрсетіледі.
// Объект A-ны жоюдан кейін қарапайым бақылау мысалы
@Override
protected void onDestroy() {
    super.onDestroy();
    // Объектіні WeakReference-ке орап, LeakCanary-ге жіберу
    refWatcher.watch(this);
}

LeakCanary өзіне тән парсерлер мен алгоритмдерді пайдаланады, және hprof файлдарын (жад шығару форматы) талдай отырып, объектілерді ұстау жолдарын тиімді табады.