Middle+
Kuidas määrata mäe lekkimise olemasolu dumpi analüüsimisel?
sobes.tech AI
Vastus AI-lt
Süsteemi mälulekke tuvastamiseks kasutatakse tööriistu, mis analüüsivad objektide graafikuid virnas (HPROF fail). Peamised sammud:
-
Mäludumpi saamine:
- Android Studio Memory Profiler abil.
- Käsklusega
adb shell dumpheap <package_name> /data/local/tmp/dump.hprof. - Süsteemi väljakutsega
Debug.dumpHprofData(filePath).
-
Dampide analüüs:
- Ava dump Android Studio's: Memory Profiler'is või menüüst "File" -> "Open".
- Objektide analüüs: Objektide sorteerimine suuruse (Shallow Size, Retained Size) ja näidete arvu järgi.
- Kahtlaste objektide otsimine: Otsige klasse, mis peaksid hävima (nt Activity, Fragment, Contexts), kuid neil on suur näidete arv või oluline
Retained Size. - Objekti tee (Reference Chain) uurimine: Valige kahtlane objekt ja koostage selle tee põhielementidele (GC roots). See näitab, kes täpselt hoiab viidet, takistades prügikoristust.
- Statiliste viidete otsimine: Statilised väljad on sageli allikad lekkedeks, kui nad hoiavad pikaajalisi viiteid kontekstidele või View'idele.
- LeakCanary kasutamine: Raamatukogu automatiseerib lekkedektsiooni, dumpi ja analüüsi reaalajas, pakkudes üksikasjaliku kirjelduse lekkekäigust.
-
Tulemuste tõlgendamine:
- Pikk tee GC root'ini, mis sisaldab viiteid objektidele, mis peaksid olema hävitatud, näitab probleemi.
- Viited statiliste väljade, AsyncTask'ide, Handler'ite viivitustega, valesti lahti ühendatud kuulajate/callbackide või singleton'ide kaudu aktiivsustel või View'idel on sageli lekked.
Näide GC root'ini tee analüüsist Android Studio Memory Profiler'is:
// Näide GC root'ini teest, mis näitab lekked
// android.app.Activity näide mDestroyed=true
// viide android.widget.LinearLayout näide
// viide android.view.View $ListenerInfo näide
// viide com.example.MyActivity$1 näide (anonüümne klass, mis rakendab View.OnClickListener)
// viide com.example.MyActivity näide (leaking this viide)
Selles näites hoiab anonüümne klass (nupuvajutuse kuulaja) varjatud viidet MyActivity-le, kuigi aktiivsus peaks juba olema hävitatud (mDestroyed=true). See kuulaja on tõenäoliselt registreeritud või hoitakse teise pikaajalise objekti poolt (nt statiline väli või singleton).