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 kodunuzu kısa bir süre duraklatması gerekir. Çoğu zaman duraklamalar fark edilmez. Ancak uygulamanız, sistemin toplayabileceğinden daha hızlı bir şekilde bellek ayırırsa toplayıcı, ayırmalarınızı karşılayacak kadar bellek boşaltırken uygulamanız gecikebilir. Gecikme, uygulamanızın kare atlamasına ve gözle görülür bir yavaşlamaya neden olabilir.
Uygulamanız yavaşlık göstermese bile bellek sızdırıyorsa arka plandayken bile bu belleği koruyabilir. 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ş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 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"i 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:
Sınıf listesinde aşağıdaki bilgiler gösterilir:
- Ayırmalar: Yığında yapılan ayırma sayısı.
Yerel Boyut: Bu nesne türü tarafından kullanılan toplam yerel bellek miktarı (bayt cinsinden). Android,
Bitmapgibi 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 grupları filtrelemek için grup 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ığı, yazma sırasında kopyalama yığını.
Ayrılan yerleri nasıl düzenleyeceğinizi 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ına göre filtreleme yapın:
- 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 bellek 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 da 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.
Yinelenen bit eşlemleri algılama
Android Studio Narwhal 4'ten itibaren Heap Dump görünümünde gereksiz bit eşlemleri de tespit edebilirsiniz.
Bunları nasıl bulacağınız aşağıda açıklanmıştır:
- Android Studio'da Profil Oluşturucu sekmesini açma
- Heap Dump'ı (veya Analyze Memory Usage) tıklayın ve uygulamanızın mevcut bellek durumunun anlık görüntüsünü almak için kaydı tıklayın.
- Android Studio'nun, birden fazla kez depolanan yinelenen bit eşlemleri işaretlemek için kullandığı sarı uyarı üçgeni ⚠️ ile ilgili analiz sonuçlarını tarayın.
- Alternatif olarak, profiler başlığına gidin, Filtreleme ölçütü:'nü seçin ve Yinelenen Bit Eşlemler ayarını belirleyin.
- Bitmap Önizleme bölmesini açmak için işaretli girişlerden herhangi birini tıklayın. Böylece, hangi resmin tekrar eden ihlalde bulunduğunu 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 onaydan yararlanı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 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 olarak 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:
Activityveya �Context'a yönelik, barındırılan Compose kompozisyon grafiğinin (ör.ComposeViewve alt composable'ları) sızmasına neden olabilecek uzun süreli referanslar.- Jetpack Compose State nesnelerinin (
MutableState), durum tutucularının veyaContextyakalayan lambda'ların sızdırılması. DisposableEffect'nınonDisposebloğundaki dinleyicileri veya gözlemcileri temizlemeyi unutma.Activityörneği içerebilenRunnablegibi 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ını tetiklemenin 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 doğru birden çok kez döndürün. Uygulamanız,
ActivityveyaContextöğesine referans tutuyorsa cihazı döndürmek genellikle bir uygulamanınActivity(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 ve 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ülen .hprof dosyanın yazılacağı konum (yeni .hprof dosya adı dahil). Örneğin:
hprof-conv heap-original.hprof heap-converted.hprof