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ı silmemeye karar verebilir.

Bu dokümanda, kodunuzdaki bellek sızıntılarını önlemeye, tespit etmeye ve çözmeye yardımcı olacak bazı en iyi uygulamalar sunulmaktadır. 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 bellek sızıntısını Google Destek Ekibi'ne bildirmeden önce, hatanın kodunuzda olmadığından emin olmak için bu belgede verilen hata ayıklama adımlarının yanı sıra en iyi uygulamaları uygulayın. 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 tümünü yaptığınızdan emin olun:

  1. Kullanılmayan kaynakları serbest bırakın.
  2. Artık ihtiyaç duyulmadığı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 yeni 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 gerekli olmadığında kaynağı serbest bıraktığınızdan emin olun. Aksi takdirde, uygulamanız bu kaynakları kullanmayı bıraktıktan sonra bile kaynaklar hafıza kullanmaya devam eder. Daha fazla bilgi için Android dokümanlarında Etkinlik yaşam döngüsü bölümünü inceleyin.

GeoSDK'lerde eski Google Haritalar referanslarını kaldırma

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 Parça#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 bir etkinlik için dinleyici kaydettiğinde (ör. düğme tıklaması veya bir görünümün durumundaki değişiklik), uygulamanın artık etkinliği izlemesi gerekmediğinde dinleyicinin kaydını sildiğinizden emin olun. 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 varış etkinliklerini dinlemek için aşağıdaki dinleyiciyi çağırdığını varsayalım: addArrivalListener yöntemi çağırır. Ayrıca, artık varış etkinliklerini izlemesi gerekmediğinde removeArrivalListener yöntemini de çağırmalıdır.

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 etme

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 karakterlerle gösterilmiştir) navView adresine yönlendirecektir. Bunu Navigation SDK'sında NavigationView veya Haritalar ya da Navigation SDK'sında MapView kullanarak yapabilirsiniz. Doğrudan NavigationView ve MapView yerine SupportNavigationFragment veya SupportMapFragment kullanabilirsiniz. Destek parçaları, yaşam döngüsü yöntemlerinin yönlendirilmesini yönetir.

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. Bu düzeltmeleri almak için uygulamanızdaki SDK'ları güncel tutun.

Bellek sızıntısı sorunlarını ayıklama

Bu belgenin önceki bölümlerinde yer alan tüm geçerli önerileri uyguladıktan sonra hâlâ bellek sızıntısı görüyorsanız hata ayıklama için bu süreci uygulayın.

Başlamadan önce Android'in belleği nasıl yönettiği hakkında bilgi sahibi olmanız gerekir. 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 beklenen düzeyde olup olmadığını kontrol edin. Sızıntı gibi görünen artan kullanımın aslında uygulamanızı çalıştırmak için gereken bellek olmadığından emin olun.
  3. Üst düzeyde hata ayıklayın. Hata ayıklama için kullanabileceğiniz çeşitli yardımcı programlar vardır. 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 edin. Bir yığın dökümü ve tahsis izlemesi alın ve ardından bunları analiz edin.
  5. Bellek sızıntılarını düzeltin.

Aşağıdaki bölümlerde bu adımlar ayrıntılı olarak açıklanmıştır.

1. Adım: Sorunu yeniden oluşturun

Sorunu yeniden oluşturamadıysanız önce bellek sızıntısına neden olabilecek senaryoları göz önünde bulundurun. Doğrudan bir görsele bakarken yığın dökümü çalışabilir. Ancak, uygulamanın başlatılması veya rastgele bir zaman noktası sırasında bir yığın dökümü alırsanız bir sızıntıyı tetikleyecek koşulları etkinleştirmemiş olabilirsiniz. Sorunu yeniden oluşturmaya çalışırken çeşitli senaryoları göz önünde bulundurun:

  • Hangi özellik grubu etkinleştirilir?

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

    • Bu sırayı etkinleştirmeyi birden çok kez 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 iterasyon denediniz mi?

Sorunu SDK'ların en son sürümünde yeniden oluşturabileceğinizden emin olun. Önceki sürümdeki sorun zaten düzeltilmiş 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ıklama yaparken bunun beklenen bir kullanım olup olmadığını veya gerçekten bir bellek sızıntısı olup olmadığını düşünün. Örneğin, farklı özellikler veya kullanıcı görevleri için şu olasılıklardan yararlanabilirsiniz:

  • Olası bilgi sızıntısı: Senaryoyu birden fazla yinelemeyle etkinleştirme zamanla bellek kullanımında 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ışı büyük olasılıkla beklenen bellek kullanımıysa sorun, uygulamanızın belleğini yöneterek çözülebilir. Yardım için bkz. Uygulamanızın belleğini yönetin.

3. adım: Yüksek düzeyde hata ayıklama

Bellek sızıntısını ayıklarken yüksek düzeyde başlayın ve daha sonra ayrıntılı inceleme yapın potansiyel riskleri daralttığınızda Öncelikle zaman içinde sızıntı olup olmadığını analiz etmek için aşağıdaki üst düzey hata ayıklama araçlarından birini kullanın:

Android Studio Memory Profiler

Bu araç, tüketilen belleğe ilişkin görsel bir histogram sunar. Yığın dökümleri ve ayırma izleme de aynı arayüzden tetiklenebilir. Bu araç, varsayılan öneridir. 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. Daha fazla bilgi için Perfetto Bellek Sayaçları başlıklı makaleyi inceleyin.

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 örnek:

  • Meminfo, belirli bir zamanda ayrıntılı hafıza bilgilerini görmenize olanak tanır.

  • 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 o kadar 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 yerel koddaki sızıntıları tespit ederken yararlıdır. Bu araç yığın izlemeyi tanımladığından, temel nedenin hata ayıklamasını hızlıca yapmanıza veya sorunun nasıl yeniden oluşturulacağını anlamanıza yardımcı olabilir. Ayırma izlemeyi kullanma adımları için Ayırma izleme ile yerel kodda bellek hatalarını ayıklama başlıklı makaleyi inceleyin.

4. Adım: Bir yığın dökümü kullanarak 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ü alıp sızıntıyı kontrol etmektir. 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ı ve bellekle ilgili diğer sorunları teşhis etmek için kullanılabilir.

Android Studio, GC tarafından düzeltilemeyen bellek sızıntılarını algılayabilir. Fotoğraf çektiğinizde Android Studio, bir etkinlik veya parça olup olmadığını kontrol eder. hâlâ erişilebilir olan ancak zaten yok edilmiş bir öğe.

  1. Yığın dökümü yakalayın.
  2. Bellek sızıntısı 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ü yakalama

Bellek yığını dökümü yakalamak için Android Debug Bridge'i (adb) veya Android Studio Bellek Profilleyici'yi kullanabilirsiniz.

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. Komut istemi açın ve adb araçlarının bulunduğu dizine gidin.
  3. Bir 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ısı 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ıklama 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 belirleme

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

  7. Bellek sızıntısının kaynağını daraltmak veya bulmak ve sorunu gidermek için bu bilgileri kullanın.

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ın düzeltilmesi, uygulamalarınızın performansını ve kararlılığını artırmaya yardımcı olur. Ayrıntılar senaryoya bağlı olarak değişir. 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 doğal kod kullanmıyor olsanız bile Google SDK'ları da dahil olmak üzere birçok yaygın Android kitaplığı doğal kod kullanır. Bellek sızıntısının yerel kodda olduğunu düşünüyorsanız hata ayıklama için kullanabileceğiniz çeşitli araçlar vardır. İ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 etme

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 belgedeki yöntemleri denediyseniz ve SDK'larımızda bellek sızıntısı olduğundan şüpheleniyorsanız aşağıdaki bilgilerden olabildiğince fazlasını ekleyerek müşteri desteğiyle iletişime geçin:

  • 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.

  • Doğal bir bellek sızıntısı bekleniyorsa heapprofd'den ayırma izleme çıktısını paylaşın.

  • 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.