Sobes.tech
Middle+

Kako odrediti prisustvo curenja memorije prilikom analize dump-a?

sobes.tech АИ

Одговор од АИ

Za identifikaciju curenja memorije u dump-u (HPROF fajlu) koriste se alati koji analiziraju grafove objekata u hrpi. Glavni koraci:

  1. Preuzimanje dump-a memorije:

    • Kroz Android Studio Memory Profiler.
    • Kroz komandu adb shell dumpheap <package_name> /data/local/tmp/dump.hprof.
    • Kroz sistemski poziv Debug.dumpHprofData(filePath).
  2. Analiza dump-a:

    • Otvaranje dump-a u Android Studio: U Memory Profiler ili kroz meni "File" -> "Open".
    • Analiza objekata: Sortiranje objekata po veličini (Shallow Size, Retained Size) i broju primera.
    • Pretraga sumnjivih objekata: Potražite klase koje bi trebalo da budu uništene (npr. Activity, Fragment, Contexts), ali imaju veliki broj primera ili značajan Retained Size.
    • Istraživanje puta do objekta (Reference Chain): Izaberite sumnjivi objekat i izgradite njegov put do korenskih objekata (GC roots). Ovo će pokazati ko tačno drži referencu, sprečavajući sakupljanje smeća.
    • Pretraga statičkih referenci: Statička polja često su izvor curenja ako čuvaju dugotrajne reference na kontekste ili View.
    • Korišćenje LeakCanary: Biblioteka automatizuje otkrivanje, dump i analizu curenja u realnom vremenu, pružajući detaljan opis puta curenja.
  3. Tumačenje rezultata:

    • Dugačak put do GC root, koji sadrži reference na objekte koji bi trebalo da budu uništeni, ukazuje na problem.
    • Reference iz statičkih polja, AsyncTask, Handler-a sa zakašnjenjima, nepravilno odjavljenih listeners/callbacks ili singleton-ova na aktivnostima ili View-ovima često su uzrok curenja.

Primer analize puta do GC root u Android Studio Memory Profiler:

// Primer puta do GC root, ukazujući na curenje
// android.app.Activity instanca sa mDestroyed=true
//   references android.widget.LinearLayout instanca
//     references android.view.View $ListenerInfo instanca
//       references com.example.MyActivity$1 instanca (Anonimna klasa koja implementira View.OnClickListener)
//         references com.example.MyActivity instanca (Leaking this reference)

U ovom primeru, anonimna klasa (slušalac na klik dugmeta) drži neizričitu referencu na MyActivity, iako aktivnost već treba da bude uništena (mDestroyed=true). Ovaj slušač je verovatno negde registrovan ili se drži od strane drugog objekta sa dugim vekom trajanja (npr. statičko polje ili singleton).