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 yol açan bellek ayırma davranışını tespit etmek için bir yığın dökümü alın. Özellikle proje zaman çizelgesinde Genişletilmiş bir kullanıcı oturumundan sonra yığın dökümlerini (genişletilmiş bir kullanıcı oturumundan sonra, hâlâ nesneleri gösterebileceği durumlarda) almak yer alır.

Bu sayfada, Android Studio'nun veri toplamak için sağladığı analiz etmek için kullanılır. Alternatif olarak, uygulama belleğinizi şuradan denetleyebilirsiniz: komut satırını dumpsys ile çalıştırın ve ayrıca Logcat'teki atık toplama (GC) etkinlikleri.

Uygulama belleğinizin profilini neden kullanmalısınız?

Android, Google Analytics 4'te yönetilen ortam: Android, uygulamanız artık bazı nesneleri kullanmıyorsa çöp toplayıcı, bellek yığınına geri yüklenir. 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. Duraklatmalar ç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 fark edilebilir bir yavaşlık olabilir.

Uygulamanız yavaşlama göstermese bile bellek sızıntısı varsa arka plandayken bile bu belleği tutabilir. Bu davranış, gereksiz çöp toplama etkinliklerini zorunlu kılarak sistemin bellek performansının geri kalanını yavaşlatabilir. Sonuç olarak sistem, hafızada bulabilirsiniz. Ardından, kullanıcı uygulamanıza döndüğünde uygulama işlemi yeniden başlatılmalıdır tamamen.

Uygulamanızın belleğini azaltabilecek programlama uygulamaları hakkında bilgi 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ünü yakalamak için: Bellek Kullanımını Analiz Etme (Yığın Dökümü) görevini seçin Yığın yakalamak için (Profiler: "app" komutunu hata ayıklaması yapılabilir (eksik veri) olarak çalıştırma seçeneğini kullanın. dökümü. 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). Burada Java'da ayrılmış bazı nesneler için bellek göreceksiniz, çünkü Android, aşağıdakiler gibi bazı çerçeve sınıfları için yerel bellek kullanır: Bitmap.

  • Sığ Boyut: Bu nesne türü tarafından kullanılan toplam Java belleği miktarı ( bayt olarak kabul edilir.

  • 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 ayırmalar hiçbir zaman hareket etmez veya ortadan kalkmaz.
  • Zygote yığını: Android sistemde bir uygulama işleminin ayrıldığı, yazma sırasında kopyalama yığınıdır.

Düzenlemelerin nasıl düzenleneceğini seçmek için düzenleme açılır menüsünü kullanın:

  • Sınıfa göre düzenle (varsayılan): Tüm ayırmaları 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ını 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çilene en kısa atlama sayısı kullanır.
  • 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.
  • Tutulan Boyut: Bu örneğin baskın olan bellek boyutu ( dominator ağacı).

Alanları ve Referansları da dahil olmak üzere Örnek Ayrıntıları'nı görmek için bir örneği tıklayın. Yaygın alan ve referans türleri, yapılandırılmış türlerdir diziler , temel veri türlerini yardımcı oldu. İlişkili örneğe gitmek için bir alanı veya referansı sağ tıklayın ya da satırını kullanın.

  • Alanlar: Bu örnekteki tüm alanları gösterir.
  • Referanslar: Vurgulanan nesneye yapılan her referansı gösterir Instance (Örnek) sekmesini tıklayın.

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 bellek sızıntısına işaret ettiğini düşündüğü sınıfları Activity ve Uygulamanızda Fragment örnek. Türler filtrenin gösterdiği veriler arasında şunlar bulunur:

  • Kaldırılmış ancak hâlâ referans verilen Activity örnek.
  • Geçerli olmayan Fragment örnek FragmentManager ancak hâlâ bir referans noktası görevi görebilir.

Filtrenin aşağıdaki durumlarda yanlış pozitiflere neden olabileceğini unutmayın: durumlar:

  • Fragment oluşturuldu ancak henüz kullanılmadı.
  • Bir Fragment önbelleğe alınıyor ancak şu öğenin bir parçası olarak değil: FragmentTransaction

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 Boyutu 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ılarını tetikleyin

Bellek kullanımını analiz etmek için uygulama kodunuza stres atıp belleği zorlamayı denemelisiniz sızdır. Uygulamanızda bellek sızıntılarını tetiklemenin bir yolu, uygulamanın bir süre çalışmasına izin vermektir inceleyin. 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:

  • Cihazı dikey yönden yatay yöne döndürün ve tekrar birkaç kez geri döndürün farklı etkinlik durumlarında olduğunu görebilirsiniz. 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 hprof-conv aracını kullanın {android_sdk}/platform-tools/ dizininde bulabilirsiniz. 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