Sobes.tech
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:

  1. 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.hprof parancs használatával.
    • A rendszerhívás Debug.dumpHprofData(filePath) segítségével.
  2. 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.
  3. 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).