Middle+
Hogyan lehet meghatározni a memória szivárgás jelenlétét a dump elemzése során?
sobes.tech MI
Válasz az MI-től
A memória szivárgásának felismeréséhez egy dump-ban (HPROF fájl) az objektumgrafikon elemzésére szolgáló eszközöket használnak. Fő lépések:
-
Memória dump készítése:
- Android Studio Memory Profiler segítségével.
- A
adb shell dumpheap <csomag_neve> /data/local/tmp/dump.hprofparancs használatával. - A rendszerhívás
Debug.dumpHprofData(filePath)segítségével.
-
Dump elemzése:
- A dump megnyitása Android Studio-ban: Memory Profiler-ben vagy a "File" -> "Open" menüben.
- Objektumok elemzése: rendezze az objektumokat méret szerint (Shallow Size, Retained Size) és példányszám szerint.
- Gyanús objektumok keresése: keressen olyan osztályokat, amelyeket meg kellene semmisíteni (pl. Activity, Fragment, Contexts), de sok példányuk vagy jelentős
Retained Size-uk van. - Az objektumhoz vezető út vizsgálata (Reference Chain): válasszon ki egy gyanús objektumot, és kövesse az útját a gyökérobjektumokhoz (GC roots). Ez megmutatja, ki tartja fenn a hivatkozást, megakadályozva a szemétgyűjtést.
- Statikus hivatkozások keresése: a statikus mezők gyakran forrásai a szivárgásoknak, ha hosszú életű hivatkozásokat tárolnak kontextusokra vagy nézetekre.
- LeakCanary használata: a könyvtár automatizálja a szivárgások felismerését, dump-olását és elemzését valós időben, részletes leírást adva a szivárgás útjáról.
-
Eredmények értelmezése:
- Egy hosszú út a GC gyökérhez, amely tartalmazza azokat az objektumokat, amelyeket meg kellene semmisíteni, problémára utal.
- A statikus mezőkből, AsyncTask-ökből, késleltetett Handler-ekből, nem megfelelően leiratkozott listener-ekből/callback-ekből vagy singleton-ökből származó hivatkozások gyakran a szivárgások okai.
Példa a GC root felé vezető út elemzésére Android Studio Memory Profiler-ben:
// Példa a GC root felé vezető útra, amely szivárgást jelez
// android.app.Activity példány mDestroyed=true értékkel
// referencia android.widget.LinearLayout-ra
// referencia android.view.View $ListenerInfo-ra
// referencia com.example.MyActivity$1 (névtelen osztály, amely implementálja a View.OnClickListener-t)
// referencia com.example.MyActivity-ra (szivárgást okozó referencia)
Ebben a példában egy névtelen osztály (gombkattintás figyelő) implicit módon tart egy referenciát a MyActivity-re, pedig az aktivitásnak már meg kellene semmisülnie (mDestroyed=true). Ez a figyelő valószínűleg más hosszú életű objektum által van regisztrálva vagy tartva (pl. statikus mező vagy singleton).