Sobes.tech
Middle+

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

sobes.tech AI

Պատասխան AI-ից

LeakCanary-ը գործում է մի քանի փուլերով:

  1. Անհայտ կորցնելը հայտնաբերել: Այն հետևում է դիտվող օբյեկտների, ինչպիսիք են Fragment, Activity, View, կյանքի ցիկլին: Երբ այդպիսի օբյեկտը ոչնչացվում է, LeakCanary-ը այն տեղադրում է թույլ թղթապանակի (WeakReference) մեջ և սկսում է մաքրման հավաքիչը:
  2. Հղման ստուգում: Մաքրման հավաքիչից հետո LeakCanary-ը ստուգում է, արդյոք օբյեկտին դեռ կա հղում: Եթե կա, դա նշանակում է, որ օբյեկտը չի հավաքվել և, հավանաբար, տեղի է ունեցել թափանցում:
  3. Համակարգչային հիշողության արտահոսք (heap dump): Երբ հնարավոր է, որ տեղի է ունեցել թափանցում, LeakCanary-ը անում է համակարգչային հիշողության արտահոսքի (heap dump) պատկերը: Դա ամբողջ հիշողության պատկերն է, որը զբաղեցրած է օբյեկտների կողմից տվյալ պահին:
  4. Օբյեկտների գրաֆի վերլուծություն: LeakCanary-ը վերլուծում է հիշողության արտահոսքի գրաֆը՝ գտնելու ճանապարհը GC արմատներից (GC roots) մինչև կասկածելի արտահոսքի օբյեկտը: Այս ճանապարհը ցույց է տալիս, թե ինչու օբյեկտը չի հավաքվել:
  5. Հաշվետվության ստեղծում: Վերլուծության հիման վրա LeakCanary-ը ստեղծում է մանրամասն հաշվետվություն արտահոսքի մասին, ներառյալ օբյեկտի պահպանումը (օբյեկտը, որը պահպանում է հղում պահվող օբյեկտին), օբյեկտի տիպը և տեղը կոդում, որտեղ, հավանաբար, տեղի է ունեցել արտահոսքը: Հաշվետվությունը ցուցադրվում է ծանուցմամբ կամ հավելվածի ներսում:
// Պարզ օրինակ՝ հետևել օբյեկտ A-ին նրա ոչնչացման հետո
@Override
protected void onDestroy() {
    super.onDestroy();
    // Օբյեկտը թուլ թղթապանակի մեջ տեղադրել և փոխանցել LeakCanary-ին
    refWatcher.watch(this);
}

LeakCanary-ը օգտագործում է իր սեփական վերլուծիչները և ալգորիթմները՝ hprof ֆայլերը (համակարգի արտահոսքի ձևաչափ) վերլուծելու համար՝ արդյունավետորեն գտնելու օբյեկտների պահպանումը։