Bellek yönetimi için en iyi uygulamalar

Bu dokümanda, Android uygulamalarıyla ilgili en iyi uygulama kılavuzuna uyguladığınız varsayılmaktadır depolama alanı yönetimi gibi Uygulamanızın belleğini yönetin.

Giriş

Bellek sızıntısı, bilgisayar çalışırken ve programının, artık ihtiyaç duyulmayan, ayrılmış belleği bırakmaması. Sızıntı uygulamanın işletim sisteminden, sahip olduğundan daha fazla bellek istemesine uygulamayı kilitleyebilir. Bir dizi uygunsuz uygulama Android uygulamalarında bellek sızıntılarına neden olabilir; örneğin, dinleyicilerin kaydını iptal etmeme gibi sorunların çözümüne yardımcı olabilir.

Bu belgede, kırılımını önlemek, tespit etmek, ve kodunuzdaki bellek sızıntılarını giderin. Bu bölümdeki yöntemleri denediyseniz bir bellek sızıntısı olduğundan şüphelenilmesi için Google SDK'larıyla ilgili sorunları bildirme

Destek ekibiyle iletişime geçmeden önce

Bir anı sızıntısını Google Destek Ekibi'ne bildirmeden önce aşağıdaki talimatları uygulayın: hata ayıklama adımlarıyla birlikte anlatıldığı gibi, ve hatanın kodunuzda olmadığından emin olun. Bu adımlar sorununuzu çözebilir ve yoksa Google Destek Ekibi'nin ihtiyacı olan bilgileri size yardımcı olur.

Bellek sızıntılarını önleme

Bu en iyi uygulamaları izleyerek Google SDK'larını kullanan kodda bellek sızıntıları.

Android uygulamaları için en iyi uygulamalar

Android uygulamanızda aşağıdakilerin hepsini yaptığınızdan emin olun:

  1. Kullanılmayan kaynakları serbest bırakın.
  2. Artık gerekli olmadığında dinleyicilerin kaydını iptal edin.
  3. Gerekmediğinde görevleri iptal edin.
  4. Kaynakları serbest bırakmak için yaşam döngüsü yöntemlerini yönlendirin.
  5. SDK'ların en son sürümlerini kullanma

Bu uygulamaların her birine ilişkin ayrıntılar için aşağıdaki bölümlere bakın.

Kullanılmayan kaynakları serbest bırakın

Android uygulamanız bir kaynak kullandığında, artık ihtiyacınız yok. Aksi takdirde kaynak, belleği kullanmaya devam eder. ve başvurunuz üzerlerinde bile kalmaya devam edecektir. Daha fazla bilgi için Etkinlik yaşam döngüsü inceleyebilirsiniz.

GeoSDK'larda eski GoogleMap referanslarını yayınlayın

Google Map uygulamasının, NavigationView veya MapView. Bir Google Haritası'nın, Alındığı NavigationView veya MapView. Siz bir Google Haritası'nın önbelleğe alınmaması veya referansın, NavigationView#onDestroy veya MapView#onDestroy çağrıldığında serbest bırakılır. Eğer NavigationSupportFragment, MapSupportFragment veya kendi parçanızı kullanarak sarmalamaktan sonra, referansın Fragment#onDestroyView.

class NavFragment : SupportNavigationFragment() {

  var googleMap: GoogleMap?

  override fun onCreateView(
    inflater: LayoutInflater,
    parent: ViewGroup?,
    savedInstanceState: Bundle?,
  ): View  {
    super.onCreateView(inflater,parent,savedInstanceState)
    getMapAsync{map -> googleMap = map}
  }

  override fun onDestroyView() {
    googleMap = null
  }
}

Artık ihtiyaç olmadığında dinleyicilerin kaydını iptal edin

Android uygulamanız düğme gibi bir etkinlik için bir işleyici kaydettiğinde veya görünümün durumunda bir değişiklik fark ederseniz, dinleyicinin kaydını iptal ettiğinizden emin olun. Böylece, uygulamanın etkinliği izlemesi gerekmiyor. Aksi takdirde uygulamanız tamamlandıktan sonra bile hafızayı kullanmaya devam eder. görüntüleyebilirsiniz.

Örneğin, uygulamanızın Navigasyon SDK'sını kullandığını ve aşağıdaki dinleyiciye varış etkinliklerini dinlemesini söyleyin: addArrivalListener varış etkinliklerini dinleme yöntemini kullandığında, removeArrivalListener .

var arrivalListener: Navigator.ArrivalListener? = null

fun registerNavigationListeners() {
  arrivalListener =
    Navigator.ArrivalListener {
      ...
    }
  navigator.addArrivalListener(arrivalListener)
}

override fun onDestroy() {
  navView.onDestroy()
  if (arrivalListener != null) {
    navigator.removeArrivalListener(arrivalListener)
  }

  ...
  super.onDestroy()
}

Gerekmediğinde görevleri iptal et

Android uygulaması, indirme veya indirme gibi eşzamansız bir görev başlattığında ağ isteğini yerine getiriyorsa, tamamlandığında görevi iptal ettiğinizden emin olun. Görev, iptal edilmezse uygulamadan sonra bile arka planda çalışmaya devam eder işledik.

En iyi uygulamalarla ilgili daha fazla bilgi için Uygulamanızın belleğini yönetme inceleyebilirsiniz.

Kaynakları serbest bırakmak için yaşam döngüsü yöntemlerini yönlendirme

Uygulamanız Navigasyon veya Haritalar SDK'sını kullanıyorsa kaynakları navView adresine yönlendirmek için yaşam döngüsü yöntemlerini (kalın olarak gösterilmiştir) navView adresine yönlendirin. Şunları yapabilirsiniz: bunu Navigasyon SDK'sında NavigationView ya da Haritalar'da MapView kullanarak yapın veya Gezinme SDK'sı. Ayrıca SupportNavigationFragment veya Doğrudan NavigationView ve MapView kullanmak yerine SupportMapFragment, tıklayın. Destek parçaları, yaşam döngüsünün yönlendirilmesini sağlar yöntemlerine göz atın.

class NavViewActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    navView = ...
    navView.onCreate(savedInstanceState)
    ...
  }

  override fun onSaveInstanceState(savedInstanceState: Bundle) {
    super.onSaveInstanceState(savedInstanceState)
    navView.onSaveInstanceState(savedInstanceState)
  }

  override fun onTrimMemory(level: Int) {
    super.onTrimMemory(level)
    navView.onTrimMemory(level)
  }

  /* Same with
    override fun onStart()
    override fun onResume()
    override fun onPause()
    override fun onConfigurationChanged(...)
    override fun onStop()
    override fun onDestroy()
  */
}

SDK'ların en son sürümlerini kullanın

Google SDK'ları sürekli yeni özellikler, hata düzeltmeleri ve performans iyileştirmeleri. Bunları almak için uygulamanızdaki SDK'ları güncel tutun gider.

Bellek sızıntılarında hata ayıklama

Geçerli tüm bu dokümanın önceki bölümlerinde hata ayıklamak için bu işlemi uygulayın.

Başlamadan önce Android'in nasıl yönettiğini öğrendiniz. hafızada bulabilirsiniz. Bilgi için Android Bellek yönetimine genel bakış.

Bellek sızıntılarında hata ayıklamak için şu işlemi uygulayın:

  1. Sorunu yeniden oluşturun. Bu adım, hata ayıklamak için elzemdir.
  2. Bellek kullanımının beklenip beklenmediğini kontrol edin. Lütfen bir sızıntı gibi görünen kullanım artışı aslında bellekten ibaret değil. gereklidir.
  3. Üst düzeyde hata ayıklayın. Kullanabileceğiniz birçok yardımcı program vardır. dört yöntem var. Bellek sorunlarının giderilmesine yardımcı olan üç farklı standart araç seti Android'de: Android Studio, Perfetto ve Android Debug Bridge (adb) komut satırı yardımcı programları.
  4. Uygulamanızın bellek kullanımını kontrol etme. Yığın dökümü alın ve ve analiz etmenize yardımcı olur.
  5. Bellek sızıntılarını düzeltme.

Aşağıdaki bölümlerde bu adımlar ayrıntılı olarak ele alınmaktadır.

1. Adım: Sorunu yeniden oluşturun

Sorunu yeniden oluşturamadıysanız öncelikle senaryoları düşünün bu durum hafıza sızıntısına neden olabilir. Doğrudan bir görsele bakarken yığın dökümü çalışabilir. Ancak, Uygulama başlatılırken veya zaman içinde başka bir rastgele noktayla bir yığın dökümü görürseniz o durumda sızıntıyı tetikleyecek koşulları etkinleştirmemiş olabilirsiniz. Dikkatlice Farklı senaryolarla çalışarak sorunu yeniden oluşturun:

  • Hangi özellik grubu etkinleştirilir?

  • Hangi kullanıcı işlemi dizisi sızıntıyı tetikler?

    • Bu diziyi etkinleştirmek için tekrar tekrar denediniz mi?
  • Uygulama hangi yaşam döngüsü durumlarında döngüsünü gerçekleştirdi?

    • Farklı yaşam döngüsü durumlarında birden fazla yineleme denediniz mi?

Sorunu en son SDK sürümünde yeniden oluşturabildiğinizden emin olun. İlgili içeriği oluşturmak için kullanılan sorun giderilmiş olabilir.

2. Adım: Uygulama için bellek kullanımının beklenip beklenmediğini kontrol edin

Her özellik ek bellek gerektirir. Farklı senaryolarda hata ayıklarken bunun beklenen bir kullanım olup olmadığını veya gerçekten olabilir. Örneğin, farklı özellikler veya kullanıcı görevleri için şu olasılıklar:

  • Olası bir sızıntı: Senaryoyu birden fazla yinelemeyle etkinleştirme zamanla bellek kullanımında bir artışa neden olur.

  • Beklenen bellek kullanımı: Bellek, senaryodan sonra geri yüklenir durdurulur.

  • Muhtemelen beklenen bellek kullanımı: Bellek kullanımı şu süreyle devam eder: zaman azalır. Bu durum, sınırlı bir önbellekten veya beklenen diğer nedenlerden kaynaklanıyor olabilir. bellek kullanımından kaynaklanır.

Uygulama davranışı beklenen bellek kullanımı ise sorun bu soruna çözüm bulmanız gerekir. Yardım için bkz. Uygulamanızın belleğini yönetin.

3. Adım: Üst düzeyde hata ayıklayın

Bellek sızıntısını ayıklarken yüksek düzeyde başlayıp daha sonra ayrıntılı inceleme yapın potansiyel riskleri daralttığınızda Aşağıdaki üst düzey kodlardan birini kullanın: :

Android Studio Bellek Profil Aracı

Bu araç, tüketilen belleğe ilişkin görsel bir histogram sunar. Yığın dökümleri ve tahsis izleme de aynı arayüzden tetiklenebilir. Bu olacaktır. Daha fazla bilgi için bkz. Android Studio Bellek Profil Aracı.

Perfetto Bellek Sayaçları

Perfetto, hassas kontrol sahibi olmanızı sağlar. fazla zaman harcıyor ve bunları tek bir histogramda sunuyor. Örneğin, daha fazla bilgi için Perfetto Bellek Sayaçları.

Perfetto kullanıcı arayüzü

Android hata ayıklama köprüsü (adb) komut satırı yardımcı programları

Perfetto ile takip edebileceğiniz içeriklerin çoğu adb komut satırı yardımcı programıdır. Birkaç önemli örnekler:

  • Meminfo, belirli bir zamandaki ayrıntılı bellek bilgilerini görüntüleme.

  • Procstats, toplu hale getirilmiş bazı önemli istatistikleri görebilirsiniz.

Burada dikkat edilmesi gereken çok önemli bir istatistik, maksimum fiziksel bellek ayak izidir. (maxRSS) oluşturun. MaxPSS doğru olmayabilir. Örneğin, öğrenmek için adb shell dumpsys procstats --help –start-testing işareti.

Ayırma izleme

Ayırma izleme, belleğin ayrıldığı yığın izlemeyi tanımlar ve serbest bırakılmadığı takdirde de. Bu adım özellikle de sudaki sızıntıları takip ederken yerel koda karşılık gelir. Bu araç yığın izlemeyi tanımladığından, kök nedende hızla hata ayıklamak veya sorunun kaynağını tekrar sorun. Tahsis izlemeyi kullanma adımları için Tahsis izleme ile yerel kodda bellek hatalarını ayıklayın.

4. Adım: Yığın dökümü ile uygulamanızın bellek kullanımını kontrol edin

Bellek sızıntısını tespit etmenin bir yolu, uygulamanızın yığın dökümünü almaktır ve sızıntı olup olmadığını kontrol edin. Yığın dökümü, tüm nesnelerin anlık görüntüsüdür bir depolama alanı kullanır. Bellek sızıntılarını teşhis etmek için kullanılabilir sorunları çözebilir.

Android Studio, GC tarafından düzeltilemeyen bellek sızıntılarını algılayabilir. Fotoğraf çekerken Android Studio, bir etkinlik veya parça olup olmadığını kontrol eder. hâlâ erişilebilir olan ancak zaten kaldırılmış olan bir dosya seçin.

  1. Yığın dökümü yakalayın.
  2. Bellek sızıntılarını bulmak için yığın dökümünü analiz edin.
  3. Bellek sızıntılarını düzeltme.

Ayrıntılar için aşağıdaki bölümleri inceleyin.

Yığın dökümü yakalayın

Yığın dökümünü yakalamak için Android Debug Bridge (adb) veya Android Studio Bellek Profil Aracı.

Yığın dökümünü yakalamak için adb kullanma

Yığın dökümünü adb için aşağıdaki adımları uygulayın:

  1. Android cihazınızı bilgisayarınıza bağlayın.
  2. Bir komut istemi açın ve adb araçlarının bulunduğu dizine gidin.
  3. Yığın dökümünü yakalamak için şu komutu çalıştırın :

    adb shell am dumpheap my.app.name $PHONE_FILE_OUT

  4. Yığın dökümünü almak için şu komutu çalıştırın:

    adb pull $PHONE_FILE_OUT $LOCAL_FILE.

Yığın dökümü yakalamak için Android Studio'yu kullanma

Android Studio Bellek Profil Aracı'nı kullanarak yığın dökümünü yakalamak için şu talimatları uygulayın: Android'deki adımlar Yığın dökümü yakalama bölümüne bakın.

Bellek sızıntılarını bulmak için yığın dökümünü analiz etme

Yığın dökümünü yakaladıktan sonra Android Studio Memory'i kullanabilirsiniz Profil Aracı'nı kullanabilirsiniz. Bunu yapmak için şu adımları uygulayın:

  1. Android projenizi Android Studio'da açın.

  2. Çalıştır'ı, ardından Hata ayıkla yapılandırmasını seçin.

  3. Android Profiler sekmesini açın.

  4. Bellek'i seçin.

  5. Yığın dökümünü aç'ı ve oluşturduğunuz yığın dökümü dosyasını seçin. Bellek profil aracı, uygulamanızın bellek kullanımının bir grafiğini gösterir.

  6. Yığın dökümünü analiz etmek için grafiği kullanın:

    • Kullanılmayan nesneleri belirleyin.

    • Çok fazla bellek kullanan nesneleri tanımlamak.

    • Her bir nesnenin ne kadar bellek kullandığını görebilirsiniz.

  7. Bellek sızıntısının kapsamını daraltmak veya kaynağını bulmak için bu bilgileri kullanın. ve düzeltebilirsiniz.

5. Adım: Bellek sızıntılarını düzeltin

Bellek sızıntısının kaynağını belirledikten sonra bunu düzeltebilirsiniz. Android uygulamalarınızdaki bellek sızıntılarını düzeltmek, performansı iyileştirmeye yardımcı olur ve kararlılığını kontrol edin. Senaryoya bağlı olarak, ayrıntılar değişiklik gösterir. Ancak, aşağıdaki öneriler yardımcı olabilir:

Diğer hata ayıklama araçları

Bu adımlar tamamlandıktan sonra, şu araçları deneyin:

Ayırma izlemeyle yerel kodda bellek hatalarını ayıklama

Doğrudan yerel kodu kullanmasanız bile, bazı yaygın Android kitaplıkları Google SDK'ları dahil. Bellek sızıntınızın yerel kodda olduğunu düşünüyorsanız zaman çizelgesi çeşitli araçlardan hata ayıklamak için kullanabilirsiniz. İkisinden biriyle atama izleme Android Studio veya heapprofd (Perfetto ile de uyumludur) inceleyerek bir riskin olası nedenlerini genellikle hata ayıklamanın en hızlı yoludur.

Ayırma izlemesi ayrıca, bir veri sayfasındaki büyük bir kısmı ancak yığında bulunabilecek hassas bilgileri içermez.

LeakCanary ile sızıntıları tespit edin

LeakCanary, Android uygulamalarındaki bellek sızıntılarını tanımlamak için kullanılan güçlü bir araçtır. LeakCanary'yi uygulamanızda kullanma hakkında daha fazla bilgi edinmek için şu adresi ziyaret edin: LeakCanary.

Google SDK'larıyla ilgili sorunları bildirme

Bu dokümandaki yöntemleri denediyseniz ve bellek sızıntısı olduğundan şüpheleniyorsanız için aşağıdaki bilgilerin mümkün olduğunca çoğunu içeren müşteri desteğine başvurun: yapın:

  • Bellek sızıntısını yeniden oluşturma adımları Adımlar karmaşık kodlama gerektiriyorsa sorunu çoğaltan kodu örnek uygulamamıza kopyalamak işe yarayabilir ve sızıntısı.

  • Sorunun yeniden oluşturulduğu, uygulamanızdan yakalanan yığın dökümleri. Yakalama yığını zamanla ilgili dökümler oluşturur. Bu da, önemli bir artış gördük.

  • Yerel bellek sızıntısı bekleniyorsa ayırmayı paylaşın çıktı takibini yapıyor heapprofd.

  • Sızıntı durumunu yeniden oluşturduktan sonra alınan bir hata raporu.

  • Bellekle ilgili kilitlenmelerin yığın izlemeleri.

    Önemli not: Yığın izleme (stack trace) genellikle tek başına yeterli değildir hatasını ayıklayın, bu nedenle diğer formlardan birini de düşünülebilir.