Middle+
Ինչպես որոշել հիշողության արտահոսքի առկայությունը դամպի վերլուծության ժամանակ?
sobes.tech AI
Պատասխան AI-ից
Հիշողության արտահոսքը որոշելու համար dump-ով (HPROF ֆայլ) օգտագործվում են գործիքներ, որոնք վերլուծում են օբյեկտների գրաֆները heap- ում: Հիմնական քայլերը՝
-
Հիշողության dump- ի ստացում:
- Android Studio Memory Profiler- ի միջոցով:
- Կամ հրամանի միջոցով
adb shell dumpheap <package_name> /data/local/tmp/dump.hprof: - Կամ
Debug.dumpHprofData(filePath)համակարգային կանչով:
-
Dump- ի վերլուծություն:
- Բացել dump- ը Android Studio- ում: Memory Profiler- ի կամ «File» -> «Open» մենյուով:
- Օբյեկտների վերլուծություն: Օբյեկտների դասակարգում չափի (Shallow Size, Retained Size) և օրինակների քանակի ըստ:
- Կասկածելի օբյեկտների որոնում: Փնտրեք այն դասերը, որոնք պետք է ոչնչացվեն (օրինակ, Activity, Fragment, Contexts), բայց ունեն մեծ քանակությամբ օրինակներ կամ կարևոր
Retained Size: - Հարցի ճանապարհի ուսումնասիրություն (Reference Chain): Ընտրեք կասկածելի օբյեկտը և կառուցեք նրա ճանապարհը հիմնական օբյեկտների (GC roots) հասնելու համար: Սա ցույց կտա, թե ով է իրականում պահպանում հղումը, կանխելով աղբահավաքը:
- Ստատիկ հղումների որոնում: Ստատիկ դաշտերը հաճախ աղբահոսքի աղբյուրներ են, եթե պահում են երկարաժամկետ հղումներ կոնտեքստների կամ View- ի վրա:
- LeakCanary- ի օգտագործում: Գրադարանն ավտոմատացնում է արտահոսքի հայտնաբերում, dump և վերլուծություն իրական ժամանակում, տրամադրելով մանրամասն նկարագրություն արտահոսքի ճանապարհի:
-
Արդյունքների մեկնաբանում:
- Երկար ճանապարհ դեպի GC root, որը պարունակում է հղումներ այն օբյեկտներին, որոնք պետք է ոչնչացվեն, ցույց է տալիս խնդիր:
- Հղումներ ստատիկ դաշտերից, AsyncTask-ներից, Handler-ներից հետաձգումներով, սխալ կերպով անջատված listeners/callback-ներից կամ singleton-ներից ակտիվությունների կամ View- ի վրա հաճախ պատճառ են արտահոսքի:
Օրինակ՝ Android Studio Memory Profiler- ում GC root- ի ճանապարհի վերլուծության օրինակ՝
// Օրինակ GC root- ի ճանապարհ, որը ցույց է տալիս արտահոսք
// android.app.Activity օրինակ mDestroyed=true
// հղում android.widget.LinearLayout օրինակ
// հղում android.view.View $ListenerInfo օրինակ
// հղում com.example.MyActivity$1 օրինակ (անանուն դաս, որը իրականացնում է View.OnClickListener)
// հղում com.example.MyActivity օրինակ (այս հղումը արտահոսք է)
Այս օրինակով, անանուն դասը (կոճակին սեղմելու հոսք) պահում է անբացատրելի հղում MyActivity- ին, իսկ ակտիվությունը արդեն պետք է լինի ոչնչացված (mDestroyed=true): Այս հոսքը, հավանաբար, գրանցված է կամ պահվում է այլ երկարաժամկետ օբյեկտի կողմից (օրինակ, statics կամ singleton):