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

Uygulamanızdaki hangi nesnelerin yakalama sırasında belleği kullandığını görmek için yığın dökümü yakalayın ve bellek sızıntılarını ya da takılmaya, donmaya ve hatta uygulama çökmelerine neden olan bellek ayırma davranışını belirleyin. Özellikle uzun bir kullanıcı oturumundan sonra yığın dökümleri almak yararlıdır. Bu durumda, artık bellekte olmaması gereken nesneler gösterilebilir.

Bu sayfada, Android Studio'nun yığın dökümlerini toplamak ve analiz etmek için sağladığı araçlar açıklanmaktadır. Alternatif olarak, dumpsys ile komut satırından uygulama belleğinizi inceleyebilir ve Logcat'te atık toplama (GC) etkinliklerini görebilirsiniz.

Uygulama belleğinizin profilini neden oluşturmalısınız?

Android, yönetilen bir bellek ortamı sağlar. Android, uygulamanızın artık bazı nesneleri kullanmadığını belirlediğinde çöp toplayıcı, kullanılmayan belleği yığına geri bırakır. Android'in kullanılmayan belleği bulma şekli sürekli olarak iyileştirilmektedir ancak tüm Android sürümlerinde sistemin bir noktada kodunuzu kısa süreliğine duraklatması gerekir. Çoğu zaman duraklamalar fark edilmez. Ancak uygulamanız, sistemin toplayabileceğinden daha hızlı bellek ayırırsa toplayıcı, ayırmalarınızı karşılayacak kadar bellek boşaltırken uygulamanızda gecikme yaşanabilir. Gecikme, uygulamanızın kare atlamasına ve görünür yavaşlamaya neden olabilir.

Uygulamanız yavaşlık göstermese bile bellek sızdırıyorsa arka plandayken bile bu belleği tutabilir. Bu davranış, gereksiz atık toplama etkinliklerini zorlayarak sistemin geri kalanının bellek performansını yavaşlatabilir. Sonunda sistem, belleği geri kazanmak için uygulama işleminizi sonlandırmak zorunda kalır. Kullanıcı uygulamanıza döndüğünde ise uygulama işlemi tamamen yeniden başlatılmalıdır.

Uygulamanızın bellek kullanımını azaltabilecek programlama uygulamaları hakkında bilgi edinmek için Uygulamanızın belleğini yönetme başlıklı makaleyi inceleyin.

Yığın dökümüne genel bakış

Yığın dökümü almak için Bellek Kullanımını Analiz Et (Yığın Dökümü) görevini seçin (Yığın dökümü almak için Profiler: run 'app' as debuggable (complete data) [Profiler: "app" uygulamasını hata ayıklanabilir olarak çalıştır (tam veriler)] seçeneğini kullanın). Yığın dökümü sırasında Java belleğinin miktarı geçici olarak artabilir. Bellek yığını dökümü, uygulamanızla aynı süreçte gerçekleştiği ve verileri toplamak için biraz bellek gerektiği için bu durum normaldir. Yığın dökümünü yakaladıktan sonra aşağıdakileri görürsünüz:

Android Studio Profiler'daki Heap Dump görünümü.

Sınıf listesinde aşağıdaki bilgiler gösterilir:

  • Ayrılan alanlar: Yığın bellekteki ayrılan alan sayısı.
  • Yerel Boyut: Bu nesne türü tarafından kullanılan toplam yerel bellek miktarı (bayt cinsinden). Android, Bitmap gibi bazı çerçeve sınıfları için yerel bellek kullandığından Java'da ayrılan bazı nesneler için burada bellek görürsünüz.

  • Yüzeysel Boyut: Bu nesne türü tarafından kullanılan toplam Java belleği miktarı (bayt cinsinden).

  • Tutulan Boyut: Bu sınıfın tüm örnekleri nedeniyle tutulan toplam bellek boyutu (bayt cinsinden).

Belirli yığınları filtrelemek için yığın menüsünü kullanın:

  • Uygulama yığını (varsayılan): Uygulamanızın bellek ayırdığı birincil yığın.
  • Resim yığını: Başlatma sırasında önceden yüklenen sınıfları içeren sistem başlatma görüntüsü. Buradaki paylaştırmalar hiçbir zaman taşınmaz veya kaldırılmaz.
  • Zygote yığını: Bir uygulama işleminin Android sisteminde çatallandığı, yazarken kopyalama yığını.

Tahsislerin nasıl düzenleneceğini seçmek için düzenleme açılır listesini kullanın:

  • Sınıfa göre düzenle (varsayılan): Tüm tahsisleri sınıf adına göre gruplandırır.
  • Pakete göre düzenle: Tüm tahsisleri paket adına göre gruplandırır.

Sınıf açılır listesini kullanarak sınıf gruplarını filtreleyin:

  • Tüm sınıflar (varsayılan): Kitaplıklardan ve bağımlılıklardan gelenler de dahil olmak üzere tüm sınıfları gösterir.
  • Etkinlik/parça sızıntılarını göster: Bellek sızıntılarına neden olan sınıfları gösterir.
  • Proje sınıflarını göster: Yalnızca projeniz tarafından tanımlanan sınıfları gösterir.

Örnek bölmesini açmak için bir sınıf adını tıklayın. Listelenen her örnekte şunlar bulunur:

  • Derinlik: Herhangi bir GC kökünden seçilen örneğe kadar olan en kısa atlama sayısı.
  • Doğal Boyut: Bu örneğin doğal bellekteki boyutu. Bu sütun yalnızca Android 7.0 ve sonraki sürümlerde görünür.
  • Yüzeysel Boyut: Bu örneğin Java belleğindeki boyutu.
  • Saklanan Boyut: Bu örneğin hakim olduğu bellek boyutu (hakimiyet ağacına göre).

Alanlar ve Referanslar dahil olmak üzere Örnek Ayrıntıları'nı göstermek için bir örneği tıklayın. Yaygın alan ve referans türleri, Java'da yapılandırılmış türler , diziler ve temel veri türleridir . Kaynak kodundaki ilişkili örneğe veya satıra gitmek için bir alanı ya da referansı sağ tıklayın.

  • Alanlar: Bu örnekteki tüm alanları gösterir.
  • Referanslar: Örnek sekmesinde vurgulanan nesneye yapılan tüm referansları gösterir.
Heap Dump araç penceresindeki Instances (Örnekler), Fields (Alanlar) ve References (Referanslar) görünümleri

Bellek sızıntılarını bulma

Bellek sızıntılarıyla ilişkili olabilecek sınıfları hızlıca filtrelemek için sınıf açılır listesini açın ve Etkinlik/parça sızıntılarını göster'i seçin. Android Studio, uygulamanızdaki Activity ve Fragment örnekleri için bellek sızıntılarına işaret ettiğini düşündüğü sınıfları gösterir.

Bellek sızıntılarını daha manuel bir şekilde aramak için sınıf ve örnek listelerine göz atarak büyük Retained Size (Saklanan Boyut) değerine sahip nesneleri bulun. Aşağıdakilerden kaynaklanan bellek sızıntılarını arayın:

  • Barındırılan Compose kompozisyon grafiğini (ör. ComposeView ve alt composable'ları) sızdırabilecek Activity veya Context'a yapılan uzun süreli referanslar.
  • Jetpack Compose State nesnelerinin (MutableState), durum tutucuların veya Context yakalayan lambda'ların sızdırılması.
  • DisposableEffect'nın onDispose bloğundaki dinleyicileri veya gözlemcileri temizlemeyi unutmak.
  • Activity örneği tutabilen Runnable gibi statik olmayan iç sınıflar.
  • Nesneleri gereğinden uzun süre tutan önbellekler.

Olası bellek sızıntıları bulduğunuzda, ilgilendiğiniz örneğe veya kaynak kodu satırına gitmek için Örnek Ayrıntıları'ndaki Alanlar ve Referanslar sekmelerini kullanın.

Test için bellek sızıntılarını tetikleme

Bellek kullanımını analiz etmek için uygulama kodunuzu zorlamalı ve bellek sızıntılarını zorla oluşturmayı denemelisiniz. Uygulamanızda bellek sızıntılarına neden olmanın bir yolu, yığını incelemeden önce uygulamanın bir süre çalışmasına izin vermektir. Sızıntılar, yığın bellekteki tahsislerin en üstüne kadar sızabilir. Ancak sızıntı ne kadar küçük olursa onu görmek için uygulamayı o kadar uzun süre çalıştırmanız gerekir.

Ayrıca, aşağıdaki yöntemlerden birini kullanarak da bellek sızıntısını tetikleyebilirsiniz:

  • Cihazı farklı etkinlik durumlarındayken dikeyden yataya ve tekrar dikeye birden çok kez döndürün. Uygulamanız, Activity veya Context öğesine referans tutuyorsa cihazı döndürmek genellikle bir uygulamanın Activity (ve dolayısıyla barındırılan Compose UI ağacı ile ilişkili durum ağaçları) sızdırmasına neden olabilir.
  • Farklı etkinlik durumlarındayken uygulamanız ile başka bir uygulama arasında geçiş yapın. Örneğin, ana ekrana gidin, ardından uygulamanıza geri dönün.

Yığın dökümü kaydını dışa ve içe aktarma

Profiler'daki Geçmiş Kayıtlar sekmesinden bir yığın dökümü dosyasını dışa ve içe aktarabilirsiniz. Android Studio, kaydı .hprof dosyası olarak kaydeder.

Alternatif olarak, jhat gibi farklı bir .hprof dosya analiz aracı kullanmak için .hprof dosyasını Android biçiminden Java SE .hprof dosya biçimine dönüştürmeniz gerekir. Dosya biçimini dönüştürmek için {android_sdk}/platform-tools/ dizininde bulunan hprof-conv aracını kullanın. hprof-conv komutunu iki bağımsız değişkenle çalıştırın: orijinal .hprof dosya adı ve dönüştürülmüş .hprof dosyanın yazılacağı konum (yeni .hprof dosya adı dahil). Örneğin:

hprof-conv heap-original.hprof heap-converted.hprof

Ek kaynaklar