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) жолун түзүңүз. Бул ким чын эле шилтемени кармап турганын көрсөтөт, бул чогултуу процесин алдын алат.
- Статикалык шилтемелерди издөө: Статикалык талаалар көбүнчө узак мөөнөттүү шилтемелерди сактагандыктан, алардын изи маанилүү.
- LeakCanary колдонуу: Китепкана автоматташтырып, реалдуу убакытта чыгышты аныктоо, дамп жана талдоо жүргүзөт, чыгуу жолун толук сүрөттөйт.
-
Натыйжаларды түшүндүрүү:
- GC rootка узун жол, ал жерде жоюлушу керек объекттерге шилтемелер болсо, көйгөй бар экенин көрсөтөт.
- Статикалык талаалардан, AsyncTask, Handlerлерден кечигүүлөр менен, туура эмес өчүрүлгөн listener/callback-дерден же singleton-дардан шилтемелер көбүнчө чыгыштын себеби болот.
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). Бул ишараты, мүмкүн, кайсы бир катарда катталган же башка узак мөөнөттүү объект тарабынан кармалган (мисалы, статикалык талаа же singleton).