Sobes.tech
Middle+

Ինչպես որոշել հիշողության արտահոսքի առկայությունը դամպի վերլուծության ժամանակ?

sobes.tech AI

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

Հիշողության արտահոսքը որոշելու համար dump-ով (HPROF ֆայլ) օգտագործվում են գործիքներ, որոնք վերլուծում են օբյեկտների գրաֆները heap- ում: Հիմնական քայլերը՝

  1. Հիշողության dump- ի ստացում:

    • Android Studio Memory Profiler- ի միջոցով:
    • Կամ հրամանի միջոցով adb shell dumpheap <package_name> /data/local/tmp/dump.hprof:
    • Կամ Debug.dumpHprofData(filePath) համակարգային կանչով:
  2. Dump- ի վերլուծություն:

    • Բացել dump- ը Android Studio- ում: Memory Profiler- ի կամ «File» -> «Open» մենյուով:
    • Օբյեկտների վերլուծություն: Օբյեկտների դասակարգում չափի (Shallow Size, Retained Size) և օրինակների քանակի ըստ:
    • Կասկածելի օբյեկտների որոնում: Փնտրեք այն դասերը, որոնք պետք է ոչնչացվեն (օրինակ, Activity, Fragment, Contexts), բայց ունեն մեծ քանակությամբ օրինակներ կամ կարևոր Retained Size:
    • Հարցի ճանապարհի ուսումնասիրություն (Reference Chain): Ընտրեք կասկածելի օբյեկտը և կառուցեք նրա ճանապարհը հիմնական օբյեկտների (GC roots) հասնելու համար: Սա ցույց կտա, թե ով է իրականում պահպանում հղումը, կանխելով աղբահավաքը:
    • Ստատիկ հղումների որոնում: Ստատիկ դաշտերը հաճախ աղբահոսքի աղբյուրներ են, եթե պահում են երկարաժամկետ հղումներ կոնտեքստների կամ View- ի վրա:
    • LeakCanary- ի օգտագործում: Գրադարանն ավտոմատացնում է արտահոսքի հայտնաբերում, dump և վերլուծություն իրական ժամանակում, տրամադրելով մանրամասն նկարագրություն արտահոսքի ճանապարհի:
  3. Արդյունքների մեկնաբանում:

    • Երկար ճանապարհ դեպի 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):