Sobes.tech
Middle+

Как LeakCanary обнаруживает утечку памяти?

sobes.tech AI

AIден жооп

LeakCanary birnäçe basgançakda işlýär:

  1. Çüýşäniň tapylmagy: Ol gözegçilik edilýän obýektleriň, meselem Fragment, Activity, View, durmuş dövrüni yzarlýar. Şeýle obýekt ýykylsa, LeakCanary ony gowşak salgysy (WeakReference) içine ýerleşdirýär we ýygnaýjy ýygnamagy başlaýar.
  2. Salgynyň bar bolmagyny barlamak: Ýygnaýjy ýygnamagyndan soň, LeakCanary obýekt bilen hələ-de salgynyň bardygyny barlaýar. Eger bar bolsa, bu obýektiň ýygnalmadygyny we muş algy edilýänligini görkezýär.
  3. Heap dump: Mümkin bolan ýygnaýjy tapylsa, LeakCanary programmaň heap dump-yny edýär. Bu, belli bir wagtyň içinde programmaň obýektleri tarapyndan eýeçiliginde bolan ähli ýadyň suratydyr.
  4. Obýektleriň grafigini seljermek: LeakCanary heap dump-yndaky obýektleriň grafigini seljýär we GC köklerinden (GC roots) şübheli ýygnaýjy obýektine çenli ýol tapýar. Bu ýol, obýektiň näme üçin ýygnalmadygyny görkezýär.
  5. Hasabat döretmek: Analiz esasynda LeakCanary ýygnaýjy barada jikme-jik hasabat döretýär, şol sanda obýektiň saklaýjy ýoly (obýekt, saklaýan obýektiň salgysy), obýekt görnüşi we kodda ýakynlaşyk bilen ýygnaýjy bolup biljek ýer. Hasabat bildiriş hökmünde ýa-da programmaň içindäki görnüşde görkezilýär.
// Obýekt A-nyň ýykylmagyndan soň ýönekeý yzarlama mysaly
@Override
protected void onDestroy() {
    super.onDestroy();
    // Obýekti WeakReference içine al we LeakCanary-e ugradyp goý
    refWatcher.watch(this);
}

LeakCanary öz parserleri we algoritmleri bilen hprof faýllaryny (heap dump formaty) seljýär we obýektleriň saklaýjy ýollaryny netijeli tapýar.