Yığın dökümü alarak uygulamanızdaki hangi nesnelerin bellek kullandığını görebilir ve bellek sızıntılarını ya da takılmalara, donmalara ve hatta uygulamanın kilitlenmesine yol açan bellek ayırma davranışını tespit edebilirsiniz. Özellikle uzun bir kullanıcı oturumundan sonra yığın dökümü almak, artık bellekte olmaması gereken nesneleri gösterebileceği için faydalıdır.
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.
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 yöntemi sürekli olarak iyileştirilmektedir ancak tüm Android sürümlerinde sistemin kodunuzu kısa bir süre duraklatması gerekir. Çoğu zaman bu duraklamalar fark edilmez. Ancak uygulamanız, sistemin toplayabileceğinden daha hızlı bellek ayırırsa toplayıcı, ayırmalarınızı karşılamak için yeterli bellek açarken uygulamanız gecikebilir. Gecikme, uygulamanızın kareleri atlamasına ve görünür bir yavaşlığa neden olabilir.
Uygulamanız yavaşlık 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 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 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]memory başlıklı makaleyi okuyun.
Yığın dökümüne genel bakış
Yığın dökümü yakalamak için Bellek Kullanımını Analiz Et (Yığın Dökümü) görevini seçin (Profiler: run 'app' as debuggable (complete data) [Profil Oluşturucu: "uygulamayı" hata ayıklanabilir olarak çalıştır (tam veri)] seçeneğini kullanın). Yığın dökümü sırasında Java bellek miktarı geçici olarak artabilir. Yığın dökümü, uygulamanızla aynı işlemde gerçekleştiği ve verileri toplamak için biraz bellek gerektiğinden 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:
- Tahsisler: Yığındaki tahsislerin sayısı.
Yerel Boyut: Bu nesne türü tarafından kullanılan yerel bellek miktarı (bayt cinsinden). Android,
Bitmapgibi bazı çerçeve sınıfları için yerel bellek kullandığından Java'da ayrılan bazı nesnelerin belleğini burada görürsünüz.Sığ Boyut: Bu nesne türü tarafından kullanılan Java belleğinin toplam 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 tahsisler hiçbir zaman taşınmaz veya kaybolmaz.
- Zygote yığını: Android sisteminde bir uygulama işleminin çatallandığı, yazma sırasında kopyalama yığını.
Tahsislerin 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 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 da 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.
- Show project classes (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 aşağıdakiler yer alır:
- Derinlik: Herhangi bir GC kökünden seçilen örneğe giden 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.
- Tutulan Boyut: Bu örneğin baskın olduğu bellek boyutu (baskın 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 her referansı gösterir.
Yinelenen bit eşlemleri algılama
Android Studio Narwhal 4'ten itibaren, Yığın Dökümü görünümünde gereksiz bitmap'leri de tespit edebilirsiniz.
Bu sorunları nasıl bulacağınızı aşağıda görebilirsiniz:
- Android Studio'da Profiler sekmesini açma
- Yığın Dökümü'nu (veya Bellek Kullanımını Analiz Et) ve ardından kaydet'i tıklayarak uygulamanızın mevcut bellek durumunun anlık görüntüsünü alın.
- Android Studio'nun birden çok kez depolanan yinelenen bitmap'leri işaretlemek için kullandığı sarı uyarı üçgeni ⚠️ için analiz sonuçlarını tarayın.
- Alternatif olarak, profil oluşturucu başlığına gidip Filtreleme ölçütü:'nü seçin ve Yinelenen Bit Eşlemler ayarını belirleyin.
- İşaretlenen girişlerden birini tıklayarak Bitmap Önizleme panelini açın. Bu panelde, hangi resmin tekrar eden sorunlara yol açtığını tam olarak görebilirsiniz.
- Kodunuzdaki gereksiz yükleme mantığını bulmak ve daha iyi bir önbelleğe alma stratejisi uygulamak için bu görsel onayı kullanın.
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 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ılarına işaret ettiğini düşündüğü sınıfları gösterir.
Bellek sızıntılarını daha manuel olarak aramak için sınıf ve örnek listelerine göz atarak tutulan boyutu büyük olan nesneleri bulun. Aşağıdakilerden herhangi birinin neden olduğu bellek sızıntılarını arayın:
- Barındırılan Compose oluşturma grafiğini (ör.
ComposeViewve alt bileşenleri) sızdırabilecekActivityveyaContextiçin uzun süreli referanslar. - Jetpack Compose State nesneleri (
MutableState), durum bilgisi depolayıcılar veyaContext'i yakalayan lambda'lar sızdırılıyor. - Bir
DisposableEffect'ninonDisposebloğundaki dinleyicileri veya gözlemcileri temizlemeyi unutmak. Activityörneği barındırabilen,Runnablegibi statik olmayan iç sınıflar.- Nesneleri gereğinden uzun süre tutan önbellekler.
Olası bellek sızıntıları bulduğunuzda, ilgili ö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ı zorlamayı denemelisiniz. Uygulamanızda bellek sızıntılarını tetiklemenin bir yolu, yığını incelemeden önce uygulamanın bir süre çalışmasına izin vermektir. Sızıntılar, yığındaki ayırmaların en üstüne kadar çıkabilir. Ancak sızıntı ne kadar küçükse, sızıntıyı görmek için uygulamayı o kadar uzun süre çalıştırmanız gerekir.
Bellek sızıntısını aşağıdaki yöntemlerden biriyle de tetikleyebilirsiniz:
- Farklı etkinlik durumlarındayken cihazı dikeyden yataya ve tekrar dikeye döndürün. Uygulamanız, eşzamansız işlemler veya durum bilgisi depolayıcılar içinde
Activityya daContextreferansı barındırıyorsa cihazı döndürmek genellikle uygulamanınActivity(ve dolayısıyla barındırdığı Oluşturma kullanıcı arayüzü ağacı ve 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ş yapma. Örneğin, ana ekrana gidip uygulamanıza geri dönün.
Yığın dökümü kaydını dışa ve içe aktarma
Profil oluşturucudaki Geçmiş Kayıtlar sekmesinden 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ülen .hprof dosyasının yazılacağı konum (yeni .hprof dosya adı dahil). Örneğin:
hprof-conv heap-original.hprof heap-converted.hprof