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:
-
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).
-
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.
-
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).