Middle+
Как LeakCanary определя препратките към унищожените Activity?
sobes.tech AI
Отговор от AI
LeakCanary използва слаб (Phantom Reference) или силен (Strong Reference) референция в специален наблюдател, който "слуша" жизнения цикъл на Activity. Когато Activity бъде унищожена, LeakCanary записва времето и чака събиране на боклука. Ако след събирането на боклука обектът Activity все още съществува в паметта, LeakCanary стартира dump на купчината (heap dump), го анализира и създава граф на достижимост, за да намери път от GC Roots към този "изтекъл" Activity.
Ключови стъпки:
- Наблюдение на жизнения цикъл: LeakCanary регистрира
ActivityLifecycleCallbacks. - Маркиране (Bookmarking): При извикване на
onDestroy(), LeakCanary създава препратка към Activity (зависи от версията) и записва времето. - Очакване на GC: LeakCanary чака да се случи събиране на боклука, за да провери дали обектът е унищожен.
- Проверка след GC: Ако обектът Activity все още е достъпен след GC, това показва потенциална теч.
- Heap dump: LeakCanary извиква
Debug.dumpHprofData()за запазване на текущото състояние на паметта. - Анализ на dump: LeakCanary (чрез Memory Analyzer Tool (MAT) или свой анализатор) сканира dump-а на паметта.
- Търсене на път: Инструментът намира пътища в графа на обектите от GC Roots до "изтеклия" обект.
- Отчет: LeakCanary генерира четим отчет, показващ веригата от препратки, която държи обекта извън събирача на боклука.