Bu belgede, bellek yönetimi kapsamında Android uygulamaları için en iyi uygulama kılavuzunu (ör. Uygulamanızın belleğini yönetme) uyguladığınız varsayılmaktadır.
Giriş
Bellek sızıntısı, bir bilgisayar programının artık ihtiyaç duyulmayan ayrılmış belleği serbest bırakmaması durumunda ortaya çıkan bir kaynak sızıntısı türüdür. Sızıntı, uygulamanın işletim sisteminden mevcut olandan daha fazla bellek istemesine ve dolayısıyla uygulamanın kilitlenmesine neden olabilir. Kaynakların düzgün şekilde imha edilmemesi veya artık ihtiyaç duyulmayan dinleyicilerin kaydının silinmemesi gibi bir dizi uygunsuz uygulama, Android uygulamalarında bellek sızıntılarına neden olabilir.
Bu belgede, kodunuzdaki bellek sızıntılarını önlemenize, tespit etmenize ve çözmenize yardımcı olacak bazı en iyi uygulamalar yer almaktadır. Bu dokümandaki yöntemleri denediyseniz ve SDK'larımızda bellek sızıntısı olduğundan şüpheleniyorsanız Google SDK'larıyla ilgili sorunları bildirme başlıklı makaleyi inceleyin.
Destek ekibiyle iletişime geçmeden önce
Google destek ekibine bellek sızıntısı bildirmeden önce, hatanın kodunuzda olmadığından emin olmak için bu dokümanda sağlanan hata ayıklama adımlarıyla birlikte en iyi uygulamaları izleyin. Bu adımlar sorununuzu çözebilir. Çözmezse Google destek ekibinin size yardımcı olmak için ihtiyaç duyduğu bilgileri oluşturur.
Bellek sızıntılarını önleme
Google SDK'larını kullanan kodlarda bellek sızıntılarının en yaygın nedenlerinden bazılarını önlemek için bu en iyi uygulamaları izleyin.
Android uygulamaları için en iyi uygulamalar
Android uygulamanızda aşağıdakilerin tümünü yaptığınızdan emin olun:
- Kullanılmayan kaynakları serbest bırakın.
- Artık ihtiyaç duyulmayan dinleyicilerin kaydını iptal edin.
- Gerekli olmayan görevleri iptal edin.
- Forward lifecycle methods to release resources.
- SDK'ların en yeni sürümlerini kullanın.
- ANR'leri önlemek için başlatma sırasında ana iş parçacığının engellenmesini önleyin.
Bu uygulamaların her biriyle ilgili ayrıntılı bilgi için aşağıdaki bölümlere bakın.
Kullanılmayan kaynakları serbest bırakma
Android uygulamanız bir kaynak kullandığında, artık ihtiyaç duyulmadığında kaynağı serbest bıraktığınızdan emin olun. Aksi takdirde, uygulamanızın kaynakla işi bittikten sonra bile kaynak bellek kullanmaya devam eder. Daha fazla bilgi için Android belgelerindeki Etkinlik yaşam döngüsü bölümünü inceleyin.
GeoSDK'lerdeki eski GoogleMap referanslarını yayınlama
Sık yapılan bir hata, NavigationView veya MapView kullanılarak önbelleğe alınırsa GoogleMap'in bellek sızıntısına neden olabilmesidir. GoogleMap, alındığı NavigationView veya MapView ile bire bir ilişkiye sahiptir. GoogleMap'in önbelleğe alınmadığından veya NavigationView#onDestroy ya da MapView#onDestroy çağrıldığında referansın serbest bırakıldığından emin olmanız gerekir. NavigationSupportFragment, MapSupportFragment veya bu görünümleri sarmalayan kendi parçanızı kullanıyorsanız referansın Fragment#onDestroyView içinde serbest bırakılması gerekir.
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ç duyulmadığında dinleyicilerin kaydını iptal etme
Android uygulamanız bir etkinlik (ör. düğme tıklaması veya görünüm durumunda değişiklik) için dinleyici kaydettiğinde, uygulama artık etkinliği izlemeye ihtiyaç duymuyorsa dinleyicinin kaydını iptal ettiğinizden emin olun. Aksi takdirde, dinleyiciler uygulamanızın onlarla işi bittikten sonra bile bellek kullanmaya devam eder.
Ö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
varış etkinliklerini dinleme yöntemi, 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()
}
Gerekli olmadığında görevleri iptal etme
Bir Android uygulaması indirme veya ağ isteği gibi eşzamansız bir görev başlattığında, görev tamamlandığında görevi iptal ettiğinizden emin olun. Görev iptal edilmezse uygulama görevle işini bitirdikten sonra bile arka planda çalışmaya devam eder.
En iyi uygulamalar hakkında daha fazla bilgi için Android belgelerindeki Uygulamanızın belleğini yönetme bölümüne bakın.
Kaynakları serbest bırakmak için yaşam döngüsü yöntemlerini iletme
Uygulamanızda Navigasyon veya Haritalar SDK'sı kullanılıyorsa yaşam döngüsü yöntemlerini (kalın harflerle gösterilir) navView öğesine yönlendirerek kaynakları serbest bıraktığınızdan emin olun. Bunu, Navigation SDK'da NavigationView veya Haritalar ya da Navigation SDK'da MapView kullanarak yapabilirsiniz. Doğrudan NavigationView ve MapView kullanmak yerine sırasıyla SupportNavigationFragment veya SupportMapFragment de 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 yeni sürümlerini kullanın
Google SDK'ları yeni özellikler, hata düzeltmeleri ve performans iyileştirmeleriyle sürekli olarak güncellenir. Bu düzeltmeleri almak için uygulamanızdaki SDK'ları güncel tutun.
ANR'leri önlemek için başlatma sırasında ana iş parçacığını engellemekten kaçının
Bir uygulama ana iş parçacığını çok uzun süre engellediğinde "Uygulama Yanıt Vermiyor" (ANR) hatasına neden olabilir. ANR'leri önlemek için onCreate() gibi yaşam döngüsü yöntemlerini, uzun süren görevleri erteleyerek veya ana iş parçacığının dışında çalıştırarak mümkün olduğunca hafif tutun.
SDK başlatma ile ilgili ANR'leri önlemek için:
- Tek seferde yalnızca bir harita örneği oluşturun.
- Haritayı örneklendirirken kullanıcı arayüzü iş parçacığındaki çalışmayı mümkün olduğunca azaltın.
Bellek sızıntılarında hata ayıklama
Bu belgede daha önce belirtilen tüm geçerli önerileri uyguladıktan sonra hâlâ bellek sızıntıları görüyorsanız hata ayıklamak için bu süreci uygulayın.
Başlamadan önce Android'in belleği nasıl yönettiğini bilmeniz gerekir. Bilgi için Android'in Bellek yönetimine genel bakış başlıklı makalesini okuyun.
Bellek sızıntılarında hata ayıklamak için şu süreci uygulayın:
- Sorunu yeniden oluşturun. Bu adım, hata ayıklama için gereklidir.
- Bellek kullanımının beklendiği gibi olup olmadığını kontrol edin. Sızıntı gibi görünen kullanım artışının, uygulamanızı çalıştırmak için gereken bellek olmadığından emin olun.
- Üst düzeyde hata ayıklama. Hata ayıklamak için kullanabileceğiniz çeşitli yardımcı programlar vardır. Android'de bellek sorunlarını ayıklamaya yardımcı olan üç farklı standart araç seti vardır: Android Studio, Perfetto ve Android Debug Bridge (adb) komut satırı yardımcı programları.
- Uygulamanızın bellek kullanımını kontrol edin. Yığın dökümü ve ayırma izleme verilerini alıp analiz edin.
- 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 önce bellek sızıntısına yol açabilecek senaryoları düşünün. Sorunun yeniden oluşturulduğunu biliyorsanız doğrudan yığın dökümüne bakmak işe yarayabilir. Ancak uygulama başlatılırken veya rastgele bir zamanda yığın dökümü alırsanız sızıntıyı tetikleyecek koşulları etkinleştirmemiş olabilirsiniz. Sorunu yeniden oluşturmaya çalışırken çeşitli senaryolar üzerinde çalışmayı deneyin:
Hangi özellikler etkinleştirilir?
Sızıntıyı tetikleyen kullanıcı işlemleri sırası nedir?
- Bu diziyi etkinleştirmek için birden fazla deneme yaptınız mı?
Uygulama hangi yaşam döngüsü durumlarından geçti?
- Farklı yaşam döngüsü durumlarında birden fazla iterasyon denediniz mi?
Sorunu SDK'ların en yeni sürümünde yeniden oluşturabildiğinizden emin olun. Önceki sürümdeki sorun zaten düzeltilmiş olabilir.
2. adım: Uygulamanın bellek kullanımının beklendiği gibi olup olmadığını kontrol edin
Her özellik ek bellek gerektirir. Farklı senaryolarda hata ayıklarken bunun beklenen bir kullanım mı yoksa bellek sızıntısı mı olduğunu değerlendirin. Örneğin, farklı özellikler veya kullanıcı görevleri için aşağıdaki olasılıkları göz önünde bulundurun:
Büyük olasılıkla sızıntı: Senaryonun birden fazla iterasyonla etkinleştirilmesi, zaman içinde bellek kullanımının artmasına neden olur.
Beklenen bellek kullanımı: Senaryo durdurulduktan sonra bellek geri kazanılır.
Beklenen bellek kullanımı: Bellek kullanımı bir süre artar, ardından azalır. Bu durum, sınırlı bir önbellekten veya beklenen diğer bellek kullanımından kaynaklanabilir.
Uygulama davranışı beklenen bellek kullanımıysa sorun, uygulamanızın belleği yönetilerek çözülebilir. Yardım için Uygulamanızın belleğini yönetme başlıklı makaleye bakın.
3. adım: Üst düzeyde hata ayıklama
Bellek sızıntısı hatalarını ayıklarken üst düzeyden başlayın ve olasılıkları daralttıktan sonra ayrıntılara inin. Zaman içinde sızıntı olup olmadığını analiz etmek için öncelikle aşağıdaki üst düzey hata ayıklama araçlarından birini kullanın:
Android Studio Memory Profiler (Önerilen)
Android Debug Bridge (adb) komut satırı yardımcı programları
Android Studio Memory Profiler
Bu araç, tüketilen belleğin görsel bir histogramını 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 Android Studio Memory Profiler'a bakın.
Perfetto Bellek Sayaçları
Perfetto, çeşitli metrikleri izleme konusunda hassas kontrol sağlar ve tüm bunları tek bir histogramda sunar. Daha fazla bilgi için Perfetto Bellek Sayaçları başlıklı makaleyi inceleyin.

Android Debug Bridge (adb) komut satırı yardımcı programları
Perfetto ile izleyebileceğiniz birçok şey, doğrudan sorgulayabileceğiniz bir adb komut satırı yardımcı programı olarak da kullanılabilir. Bu konuda birkaç önemli örnek:
Meminfo, belirli bir zamandaki ayrıntılı bellek bilgilerini görmenizi sağlar.
Procstats, zaman içinde bazı önemli toplu istatistikler sağlar.
Burada incelenmesi gereken önemli bir istatistik, uygulamanın zaman içinde ihtiyaç duyduğu maksimum fiziksel bellekte kaplanan yerdir (maxRSS). MaxPSS o kadar doğru olmayabilir. Doğruluğu artırmanın bir yolu için adb shell dumpsys procstats --help –start-testing işaretine bakın.
Tahsis takibi
Tahsis izleme, belleğin tahsis edildiği ve boşaltılmadığı yığın izlemeyi (stack trace) tanımlar. Bu adım, özellikle yerel koddaki sızıntıları takip ederken faydalıdır. Bu araç, yığın izlemeyi (stack trace) tanımladığından temel nedeni hızlı bir şekilde ayıklamak veya sorunun nasıl yeniden oluşturulacağını anlamak için mükemmel bir araç olabilir. Ayırma izlemeyi kullanma adımları için Ayırma izleme ile yerel kodda bellekte hata ayıklama başlıklı makaleyi inceleyin.
4. adım: Yığın dökümüyle 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ı olup olmadığını incelemektir. Yığın dökümü, bir uygulamanın belleğindeki tüm nesnelerin anlık görüntüsüdü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ı tespit edebilir. Yığın dökümü aldığınızda Android Studio, hâlâ erişilebilir olan ancak daha önce yok edilmiş bir etkinlik veya parça olup olmadığını kontrol eder.
- Yığın dökümü alma
- Bellek sızıntılarını bulmak için yığın dökümünü analiz edin.
- Bellek sızıntılarını düzeltme
Ayrıntılar için aşağıdaki bölümlere bakın.
Yığın dökümü oluşturma
Yığın dökümü yakalamak için Android Debug Bridge (adb) veya Android Studio Memory Profiler'ı kullanabilirsiniz.
Yığın dökümü yakalamak için adb'yi kullanma
adb kullanarak yığın dökümü yakalamak için aşağıdaki adımları uygulayın:
- Android cihazınızı bilgisayarınıza bağlayın.
- Bir komut istemi açın ve adb araçlarının bulunduğu dizine gidin.
Yığın dökümü yakalamak için şu komutu çalıştırın :
adb shell am dumpheap my.app.name $PHONE_FILE_OUTYığı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 Memory Profiler'ı kullanarak yığın dökümü yakalamak için Android Yığın dökümü yakalama bölümündeki adımları uygulayı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 Profiler'ı kullanarak analiz edebilirsiniz. Bu işlemi gerçekleştirmek için aşağıdaki adımları uygulayın:
Android projenizi Android Studio'da açın.
Run'ı (Çalıştır) ve ardından Debug (Hata ayıkla) yapılandırmasını seçin.
Android Profiler sekmesini açın.
Hafıza'yı seçin.
Yığın dökümünü aç'ı ve oluşturduğunuz yığın dökümü dosyasını seçin. Memory Profiler, uygulamanızın bellek kullanımını gösteren bir grafik görüntüler.
Yığın dökümünü analiz etmek için grafiği kullanın:
Artık kullanılmayan nesneleri belirleyin.
Çok fazla bellek kullanan nesneleri belirleme
Her nesnenin ne kadar bellek kullandığını görebilirsiniz.
Bellek sızıntısının kaynağını daraltmak veya bulmak ve düzeltmek için bu bilgileri kullanın.
5. adım: Bellek sızıntılarını düzeltme
Bellek sızıntısının kaynağını belirledikten sonra sorunu düzeltebilirsiniz. Android uygulamalarınızdaki bellek sızıntılarını düzeltmek, uygulamalarınızın performansını ve kararlılığını artırmaya yardımcı olur. Ayrıntılar senaryoya göre değişiklik gösterir. Ancak aşağıdaki öneriler yardımcı olabilir:
Uygulamanızın, Uygulamanızın belleğini yönetme başlıklı Android konusunda önerildiği şekilde bellek ayırdığından ve ayırdığı belleği serbest bıraktığından emin olun.
Uygulamanızdan kullanılmayan kodları veya kaynakları kaldırın. Android uygulamalarıyla ilgili ayrıntılar için Android uygulamaları için en iyi uygulamalar başlıklı makaleyi inceleyin.
Diğer hata ayıklama araçları
Bu adımlar tamamlandıktan sonra bellek sızıntısını hâlâ bulup düzeltemediyseniz aşağıdaki araçları deneyin:
Tahsis izleme ile yerel kodda bellekte hata ayıklama
Doğrudan yerel kod kullanmıyor olsanız bile Google SDK'ları da dahil olmak üzere yaygın olarak kullanılan çeşitli Android kitaplıkları yerel 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. Android Studio veya heapprofd (Perfetto ile de uyumludur) ile ayırma takibi, bellek sızıntısının olası nedenlerini belirlemenin mükemmel bir yoludur ve genellikle hata ayıklamanın en hızlı yöntemidir.
Ayırma izlemenin bir diğer avantajı da, yığında bulunabilecek hassas bilgileri dahil etmeden sonuçları paylaşmanıza olanak tanımasıdır.
LeakCanary ile sızıntıları tespit etme
LeakCanary, Android uygulamalarındaki bellek sızıntılarını tespit etmek için kullanabileceğiniz güçlü bir araçtır. LeakCanary'yi uygulamanızda nasıl kullanacağınız hakkında daha fazla bilgi edinin.
Google SDK'larıyla ilgili sorunları bildirme
Bu dokümandaki yöntemleri denediyseniz ve SDK'larımızda bellek sızıntısı olduğundan şüpheleniyorsanız aşağıdaki bilgileri mümkün olduğunca eksiksiz şekilde ekleyerek müşteri destek ekibiyle iletişime geçin:
Bellek sızıntısını yeniden oluşturma adımları. Adımlar karmaşık kodlama gerektiriyorsa sorunu tekrarlayan kodu örnek uygulamamıza kopyalamak ve sızıntıyı tetiklemek için kullanıcı arayüzünde yapılması gereken ek adımları sağlamak faydalı olabilir.
Sorunun yeniden oluşturulduğu uygulamanızdan alınan yığın dökümleri. Bellek kullanımının önemli ölçüde arttığını gösteren iki farklı zamanda yığın dökümleri alın.
Yerel bellek sızıntısı bekleniyorsa heapprofd'den ayırma izleme çıkışını paylaşın.
Sızıntı koşulunu yeniden oluşturduktan sonra alınan hata raporu.
Bellekle ilgili kilitlenmelerin yığın izlemeleri.
Önemli not: Yığın izlemeler (stack trace) genellikle bellek sorunlarında hata ayıklama yapmak için tek başına yeterli olmaz. Bu nedenle, diğer bilgi biçimlerinden birini de sağladığınızdan emin olun.