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

Uygulamanızdaki hangi nesnelerin yakalama sırasında bellek kullandığını görmek ve bellek sızıntılarını ya da takılmalara, donmalara ve hatta uygulama kilitlenmelerine neden olan bellek ayırma davranışını tespit etmek için bir yığın dökümü alın. Özellikle uzun bir kullanıcı oturumundan sonra yığın dökümleri almak faydalıdır. Bu dökümler, artık bellekte olmaması gereken nesneleri gösterebilir.

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 çöp toplama (GC) etkinliklerini görebilirsiniz.

Uygulamanızın belleğini neden profillemeniz gerekir?

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 yöntemi sürekli olarak iyileştiriliyor olsa da tüm Android sürümlerinde sistemin bir noktada kodunuzu kısa süreliğine duraklatması gerekir. Duraklamalar çoğu zaman fark edilmez. Ancak uygulamanız belleği sistemden daha hızlı ayarlarsa toplayıcı, ayırdığınız alanı karşılayacak kadar bellek boşaltırken uygulamanız gecikebilir. Gecikme, uygulamanızın kareleri atlamasına ve belirgin bir yavaşlığa neden olabilir.

Uygulamanız yavaşlama göstermese bile bellek sızıntısı varsa arka plandayken bile bu belleği koruyabilir. Bu davranış, gereksiz çöp toplama etkinliklerini zorunlu kılarak sistemin bellek performansının geri kalanını yavaşlatabilir. Sonunda sistem, belleği geri almak için uygulama işleminizi sonlandırmak zorunda kalır. Ardından, kullanıcı uygulamanıza geri döndüğünde uygulama işleminin tamamen yeniden başlatılması gerekir.

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

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

Bir yığın dökümünü yakalamak için Bellek Kullanımını Analiz Et (Yığın Döküm) görevini seçin (Profilleyici: "uygulama"yı hata ayıklanabilir olarak çalıştır (tam veri) seçeneğini kullanarak yığın dökümünü yakalayabilirsiniz). Yığın dökülürken Java bellek 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 gerektirdiği için bu durum normaldir. Yığın dökümünü yakaladıktan sonra aşağıdakileri görürsünüz:

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

  • Ayrımlar: Yığıntaki ayırmaların 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 burada Java'da ayrılan bazı nesnelerin belleğini görürsünüz.

  • Sığ 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 belleğin toplam 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ı: Önyükleme sırasında önceden yüklenen sınıfları içeren sistem önyükleme resmi. Buradaki tahsisler hiçbir zaman taşınmaz veya kaldırılmaz.
  • Zygote yığını: Android sistemde bir uygulama işleminin ayrıldığı, yazma sırasında kopyalama yığınıdır.

Düzenleme açılır menüsünü kullanarak tahsislerin nasıl düzenleneceğini seçin:

  • 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 gruplarına göre filtrelemek için sınıf açılır menüsünü kullanın:

  • Tüm sınıflar (varsayılan): Kitaplıklardaki ve bağımlılıklardaki sınıflar dahil 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 örnek aşağıdakileri içerir:

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

Alanları ve Referansları da dahil olmak üzere Örnek Ayrıntıları'nı görmek için bir örneği tıklayın. Java'da yaygın alan ve referans türleri, yapılandırılmış türler, diziler ve ilkel veri türleri'dir. Kaynak koddaki ilişkili örneğe veya satıra gitmek için bir alanı veya 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.

Bellek sızıntısı 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 menüsünü açıp 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ısı olduğunu düşündüğü sınıfları gösterir. Filtrenin gösterdiği veri türleri şunlardır:

  • Kaldırılmış ancak hâlâ referans verilen Activity örnekleri.
  • Geçerli bir FragmentManager değeri olmayan ancak hâlâ referans verilen Fragment örnekleri.

Filtrenin aşağıdaki durumlarda yanlış pozitif sonuç verebileceğini unutmayın:

  • Bir Fragment oluşturuldu ancak henüz kullanılmadı.
  • Bir Fragment önbelleğe alınıyor ancak FragmentTransaction kapsamında değil.

Bellek sızıntısı olup olmadığını daha manuel bir şekilde kontrol etmek için sınıf ve örnek listelerine göz atarak Sabit Boyut özelliğinin değeri büyük olan nesneleri bulun. Aşağıdakilerden herhangi birinin neden olduğu bellek sızıntılarını arayın:

  • Activity, Context, View, Drawable ve Activity veya Context kapsayıcısına referans içerebilecek diğer nesnelere yönelik uzun ömürlü referanslar.
  • Activity örneği barındırabilen Runnable gibi statik olmayan iç sınıflar.
  • Nesneleri gereğinden uzun süre tutan önbellekler.

Olası bellek sızıntıları tespit ettiğinizde, ilgilendiğiniz örneğin veya kaynak kod satırının üzerine atlamak için Örnek Ayrıntıları'ndaki Alanlar ve Referanslar sekmelerini kullanın.

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

Bellek kullanımını analiz etmek için uygulama kodunuzu zorlamanız ve bellek sızıntısı oluşturmayı denemeniz gerekir. Uygulamanızda bellek sızıntısı oluşturmanın bir yolu, yığını incelemeden önce uygulamanın bir süre çalışmasını sağlamaktır. Sızıntılar, yığıntaki ayırmaların üst kısmına kadar sızabilir. Ancak sızıntının boyutu ne kadar küçük olursa onu görmek için uygulamayı o kadar uzun süre çalıştırmanız gerekir.

Aşağıdaki yöntemlerden birini kullanarak da bellek sızıntısı tetikleyebilirsiniz:

  • Farklı etkinlik durumlarındayken cihazı dikeyden yatay konuma ve tekrar dikey konuma birkaç kez döndürün. Cihazın döndürülmesi genellikle uygulamanın Activity, Context veya View nesnesi sızınmasına neden olabilir. Bunun nedeni, sistemin Activity nesnesini yeniden oluşturmasıdır. Uygulamanız bu nesnelerden birine başka bir yerde referans veriyorsa sistem bu nesneyi çöp toplama işlemine tabi tutamaz.
  • Farklı etkinlik durumlarındayken uygulamanız ile başka bir uygulama arasında geçiş yapın. Örneğin, ana ekrana gidip uygulamanıza geri dönün.

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

Profilleyicideki Geçmiş Kayıtlar sekmesinden bir yığın dökümü dosyasını dışa aktarabilir 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 yeni .hprof dosya adı da dahil olmak üzere dönüştürülmüş .hprof dosyasının yazılacağı konum. Örneğin:

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