Sobes.tech
Middle+

Как LeakCanary определя препратките към унищожените Activity?

sobes.tech AI

Отговор от AI

LeakCanary използва слаб (Phantom Reference) или силен (Strong Reference) референция в специален наблюдател, който "слуша" жизнения цикъл на Activity. Когато Activity бъде унищожена, LeakCanary записва времето и чака събиране на боклука. Ако след събирането на боклука обектът Activity все още съществува в паметта, LeakCanary стартира dump на купчината (heap dump), го анализира и създава граф на достижимост, за да намери път от GC Roots към този "изтекъл" Activity.

Ключови стъпки:

  1. Наблюдение на жизнения цикъл: LeakCanary регистрира ActivityLifecycleCallbacks.
  2. Маркиране (Bookmarking): При извикване на onDestroy(), LeakCanary създава препратка към Activity (зависи от версията) и записва времето.
  3. Очакване на GC: LeakCanary чака да се случи събиране на боклука, за да провери дали обектът е унищожен.
  4. Проверка след GC: Ако обектът Activity все още е достъпен след GC, това показва потенциална теч.
  5. Heap dump: LeakCanary извиква Debug.dumpHprofData() за запазване на текущото състояние на паметта.
  6. Анализ на dump: LeakCanary (чрез Memory Analyzer Tool (MAT) или свой анализатор) сканира dump-а на паметта.
  7. Търсене на път: Инструментът намира пътища в графа на обектите от GC Roots до "изтеклия" обект.
  8. Отчет: LeakCanary генерира четим отчет, показващ веригата от препратки, която държи обекта извън събирача на боклука.