Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech AI
Պատասխան AI-ից
LeakCanary-ը գործում է մի քանի փուլերով:
- Անհայտ կորցնելը հայտնաբերել: Այն հետևում է դիտվող օբյեկտների, ինչպիսիք են Fragment, Activity, View, կյանքի ցիկլին: Երբ այդպիսի օբյեկտը ոչնչացվում է, LeakCanary-ը այն տեղադրում է թույլ թղթապանակի (WeakReference) մեջ և սկսում է մաքրման հավաքիչը:
- Հղման ստուգում: Մաքրման հավաքիչից հետո LeakCanary-ը ստուգում է, արդյոք օբյեկտին դեռ կա հղում: Եթե կա, դա նշանակում է, որ օբյեկտը չի հավաքվել և, հավանաբար, տեղի է ունեցել թափանցում:
- Համակարգչային հիշողության արտահոսք (heap dump): Երբ հնարավոր է, որ տեղի է ունեցել թափանցում, LeakCanary-ը անում է համակարգչային հիշողության արտահոսքի (heap dump) պատկերը: Դա ամբողջ հիշողության պատկերն է, որը զբաղեցրած է օբյեկտների կողմից տվյալ պահին:
- Օբյեկտների գրաֆի վերլուծություն: LeakCanary-ը վերլուծում է հիշողության արտահոսքի գրաֆը՝ գտնելու ճանապարհը GC արմատներից (GC roots) մինչև կասկածելի արտահոսքի օբյեկտը: Այս ճանապարհը ցույց է տալիս, թե ինչու օբյեկտը չի հավաքվել:
- Հաշվետվության ստեղծում: Վերլուծության հիման վրա LeakCanary-ը ստեղծում է մանրամասն հաշվետվություն արտահոսքի մասին, ներառյալ օբյեկտի պահպանումը (օբյեկտը, որը պահպանում է հղում պահվող օբյեկտին), օբյեկտի տիպը և տեղը կոդում, որտեղ, հավանաբար, տեղի է ունեցել արտահոսքը: Հաշվետվությունը ցուցադրվում է ծանուցմամբ կամ հավելվածի ներսում:
// Պարզ օրինակ՝ հետևել օբյեկտ A-ին նրա ոչնչացման հետո
@Override
protected void onDestroy() {
super.onDestroy();
// Օբյեկտը թուլ թղթապանակի մեջ տեղադրել և փոխանցել LeakCanary-ին
refWatcher.watch(this);
}
LeakCanary-ը օգտագործում է իր սեփական վերլուծիչները և ալգորիթմները՝ hprof ֆայլերը (համակարգի արտահոսքի ձևաչափ) վերլուծելու համար՝ արդյունավետորեն գտնելու օբյեկտների պահպանումը։