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

  1. 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).
  2. 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.
  3. 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).