Middle+
Чӣ гуна муайян кардан мумкин аст, ки дар таҳлили дамп мавҷудияти сӯроқ кардани хотира вуҷуд дорад?
sobes.tech AI
Ҷавоб аз AI
Барои муайян кардани ҷорӣ шудани хотира дар дамп (файли HPROF) аз асбобҳое истифода мешаванд, ки графҳои объектҳоро дар хишт таҳлил мекунанд. Қадамҳои асосӣ:
-
Гирифтани дампи хотира:
- Тарафи Android Studio Memory Profiler.
- Бо фармони
adb shell dumpheap <package_name> /data/local/tmp/dump.hprof. - Бо истифода аз занҷираи
Debug.dumpHprofData(filePath).
-
Таҳлили дамп:
- Кушодани дамп дар Android Studio: Дар Memory Profiler ё тавассути менюи "File" -> "Open".
- Таҳлили объектҳо: Тартиб додани объектҳо ба рӯйи андоза (Shallow Size, Retained Size) ва шумораи намунаҳо.
- Ҷустуҷӯи объектҳои шубҳанок: Ҷустуҷӯи синфҳое, ки бояд нобуд шаванд (масалан, Activity, Fragment, Contexts), аммо шумораи калон ё
Retained Sizeмуҳим доранд. - Таҳлили роҳ ба объект (Reference Chain): Интихоб кардани объекти шубҳанок ва сохтани роҳи он ба объектҳои асосӣ (GC roots). Ин нишон медиҳад, ки кӣ воқеан пайвандро нигоҳ медорад, ки мўътадил кардани ҷамъоварии партовро пешгирӣ мекунад.
- Ҷустуҷӯи пайвандҳои статикӣ: Маҳз майдонҳои статикӣ аксар манбаи ҷорӣ шудани хотира мебошанд, агар онҳо пайвандҳои дарозмуддат ба контекстҳо ё View-ҳо нигоҳ доранд.
- Истифодаи LeakCanary: Китобхона автоматӣ муайян мекунад, дамп мекунад ва таҳлил мекунад ҷорӣ шудани хотираро дар вақти воқеӣ, бо тавсифи муфассал аз роҳи ҷорӣ шудан.
-
Таҳлили натиҷаҳо:
- Роҳи дароз ба GC root, ки пайвандҳо ба объектҳое доранд, ки бояд нобуд шаванд, нишон медиҳад, ки мушкил вуҷуд дорад.
- Пайвандҳо аз майдонҳои статикӣ, AsyncTask, Handler-ҳо бо таъхирҳо, listener/callbacks-ҳои нодуруст ё singleton-ҳо дар фаъолиятҳо ё View-ҳо аксар сабаби ҷорӣ шудани хотира мебошанд.
Масалан, таҳлили роҳи ба GC root дар Android Studio Memory Profiler:
// Масалан, роҳи ба 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). Ин слушатель эҳтимолан дар ҷое сабт шудааст ё аз ҷониби объекти дигар бо умри дароз нигоҳ дошта мешавад (масалан, майдони статикӣ ё singleton).