Android Profil Aracı'nda yer alan ve takılma, donma ve hatta uygulama kilitlenmelerine neden olabilecek bellek sızıntılarını ve bellek karmaşasını tanımlamanıza yardımcı olan bir bileşendir. Uygulamanızın bellek kullanımına dair gerçek zamanlı bir grafik gösterir, ayrıca yığın dökümü yakalamanızı, atık toplama işlemlerini zorunlu kılmanızı ve bellek ayırmalarını izlemenizi sağlar.
Bellek Profil Aracı'nı açmak için şu adımları uygulayın:
- Görünüm > Araç Pencereleri > Profil Aracı'nı tıklayın (araç çubuğundan Profil
simgesini de tıklayabilirsiniz).
- Android Profiler araç çubuğundan, profilini çıkarmak istediğiniz cihaz ve uygulama işlemini seçin. Bir cihazı USB ile bağladıysanız ancak listede görmüyorsanız USB hata ayıklamasını etkinleştirdiğinizden emin olun.
- Bellek Profil Aracı'nı açmak için MEMORY zaman çizelgesinde herhangi bir yeri tıklayın.
Alternatif olarak, dumpsys ile komut satırından uygulama belleğinizi inceleyebilir ve GC etkinliklerini logcat'te görebilirsiniz.
Uygulama belleğinizin profilini neden eklemelisiniz?
Android, yönetilen bir bellek ortamı sağlar. Uygulamanızın artık bazı nesneleri kullanmadığını belirlediğinde, çöp toplayıcı, kullanılmayan belleği yığına geri gönderir. Android'in kullanılmayan belleği bulma yöntemi sürekli olarak iyileştirilmektedir. Ancak bir noktada tüm Android sürümlerinde sistemin kısa bir süreliğine kodunuzu duraklatması gerekmektedir. Duraklamalar çoğu zaman anlamsız olur. Ancak uygulamanız, belleği sistemin toplayabileceğinden daha hızlı ayırırsa toplayıcı, tahsis edilen bellek miktarını boşaltırken uygulamanız gecikebilir. Gecikme, uygulamanızın kareleri atlamasına ve gözle görülür yavaşlığa neden olabilir.
Uygulamanız yavaşlık göstermese bile, bellek sızıntısı yaşıyorsa arka plandayken bile bu belleği koruyabilir. Bu davranış, gereksiz çöp toplama etkinliklerini zorlayarak sistemin geri kalan bellek performansını yavaşlatabilir. En sonunda sistem, belleği geri kazanmak için uygulama işleminizi sonlandırmak zorunda kalır. Daha sonra, kullanıcı uygulamanıza döndüğünde uygulama tamamen yeniden başlatılmalıdır.
Bu sorunları önlemek için Memory Profiler'ı aşağıdakileri yapmak için kullanmanız gerekir:
- Zaman çizelgesinde, performans sorunlarına neden olabilecek istenmeyen bellek ayırma kalıplarını arayın.
- Herhangi bir zamanda hangi nesnelerin belleği kullandığını görmek için Java yığınını boşaltın. Uzun süreli birkaç yığın dökümü, bellek sızıntılarını tespit etmenize yardımcı olabilir.
- Normal ve aşırı kullanıcı etkileşimleri sırasında kodunuzun tam olarak nereye kısa sürede çok fazla nesne ayırdığını veya sızdırılan nesneleri tahsis ettiğini belirlemek için bellek ayırmalarını kaydedin.
Uygulamanızın bellek kullanımını azaltabilecek programlama uygulamaları hakkında bilgi edinmek için Uygulamanızın belleğini yönetme bölümünü okuyun.
Memory Profiler'a genel bakış
Bellek Profil Aracı'nı ilk açtığınızda atık toplamayı zorlamak, yığın dökümü yakalamak ve bellek ayırmalarını kaydetmek için uygulamanızın bellek kullanımıyla ilgili ayrıntılı bir zaman çizelgesi ve erişim araçları görürsünüz.
Şekil 1. Bellek Profil Aracı
Şekil 1'de belirtildiği gibi, Bellek Profilcisi için varsayılan görünüm aşağıdakileri içerir:
- Atık toplama etkinliğini zorunlu kılan bir düğme.
-
Yığın dökümü yakalama düğmesi.
Not: Bellek ayırma işlemlerini kaydetme düğmesi, yalnızca Android 7.1 (API düzeyi 25) veya önceki sürümleri çalıştıran bir cihaza bağlı olduğunda yığın dökümü düğmesinin sağında görünür.
- Profil oluşturucunun bellek ayırmalarını ne sıklıkta yakaladığını belirten bir açılır menü. Uygun seçeneği belirlemek, profil oluşturma sırasında uygulama performansını iyileştirmenize yardımcı olabilir.
- Zaman çizelgesini yakınlaştırma/uzaklaştırma düğmeleri.
- Canlı bellek verilerine atlamanızı sağlayan bir düğme.
- Etkinlik durumlarını, kullanıcı giriş etkinliklerini ve ekran rotasyonu etkinliklerini gösteren etkinlik zaman çizelgesi.
- Aşağıdakileri içeren bellek kullanımı zaman çizelgesi:
- Soldaki y ekseni ve üstteki renk tuşu ile gösterildiği şekilde her bellek kategorisinin ne kadar bellek kullandığını gösteren yığınlı grafik.
- Kesik çizgili bir çizgi, sağdaki y ekseniyle gösterildiği gibi ayrılan nesnelerin sayısını belirtir.
- Her çöp toplama etkinliği için bir simge.
Ancak Android 7.1 veya önceki sürümleri çalıştıran bir cihaz kullanıyorsanız profil çıkarma verilerinin tamamı varsayılan olarak görünmez. "Seçilen işlem için gelişmiş profil çıkarma kullanılamıyor" mesajını görürseniz aşağıdakileri görmek için gelişmiş profil oluşturmayı etkinleştirmeniz gerekir:
- Etkinlik zaman çizelgesi
- Ayrılan nesne sayısı
- Atık toplama etkinlikleri
Android 8.0 ve sonraki sürümlerde, hata ayıklaması yapılabilecek uygulamalar için gelişmiş profil oluşturma her zaman etkindir.
Bellek nasıl sayılır?
Bellek Profil Aracı'nın üst kısmında gördüğünüz sayılar (şekil 2), Android sistemine göre uygulamanızın kaydettiği tüm özel bellek sayfalarını temel alır. Bu sayıya sistem veya diğer uygulamalarla paylaşılan sayfalar dahil değildir.
2. Şekil. Bellek Profil Aracı'nın üst kısmındaki bellek sayısı açıklaması
Bellek sayısındaki kategoriler aşağıdaki gibidir:
- Java: Java veya Kotlin kodundan ayrılan nesnelerden gelen bellek.
Yerel: C veya C++ kodundan ayrılan nesnelerden gelen bellek.
Uygulamanızda C++ kullanmıyor olsanız bile, burada yerel belleğin kullanıldığını görebilirsiniz. Bunun nedeni, yazdığınız kod Java veya Kotlin'de olsa bile Android çerçevesinin görüntü öğelerini ve diğer grafikleri işleme gibi çeşitli görevleri sizin adınıza yerine getirmek için yerel bellek kullanmasıdır.
Grafik: GL yüzeyleri, GL dokuları vb. dahil olmak üzere, pikselleri ekranda görüntülemek üzere grafik arabelleğe alma sıraları için kullanılan bellek. (Bunun özel GPU belleği değil, CPU ile paylaşılan bellek olduğunu unutmayın.)
Yığın: Uygulamanızda hem yerel hem de Java yığınları tarafından kullanılan bellek. Bu genellikle uygulamanızın kaç iş parçacığı çalıştırdığıyla ilgilidir.
Kod: Uygulamanızın dex bayt kodu, optimize edilmiş veya derlenmiş dex kodu, .so kitaplıkları ve yazı tipleri gibi kod ve kaynaklar için kullandığı bellektir.
Diğerleri: Uygulamanızın nasıl kategorize edeceğinden emin olmadığı, uygulamanızın kullandığı bellek.
Ayrılan: Uygulamanız tarafından ayrılan Java/Kotlin nesnelerinin sayısı. C veya C++'ta ayrılan nesneleri saymaz.
Android 7.1 ve önceki sürümleri çalıştıran bir cihaza bağlandığında bu ayırma sayısı yalnızca Bellek Profil Aracı çalışan uygulamanıza bağlandığı anda başlar. Böylece profil çıkarmaya başlamadan önce ayrılan nesneler hesaba katılmaz. Bununla birlikte, Android 8.0 ve sonraki sürümler tüm ayırmaları izleyen bir cihaz üzerinde profil oluşturma aracı içerdiğinden bu sayı daima Android 8.0 ve sonraki sürümlerdeki uygulamanızda bulunan ve etkin olmayan Java nesnelerinin toplam sayısını gösterir.
Yeni Bellek Profil Aracı, önceki Android Monitor aracındaki bellek sayılarıyla karşılaştırıldığında, belleğinizi farklı bir şekilde kaydeder. Bu nedenle, bellek kullanımınız artık daha yüksek gibi görünebilir. Bellek Profil Aracı, toplamı artıran bazı ekstra kategorileri izler ancak yalnızca Java yığın belleğiyle ilgileniyorsanız "Java" sayısı önceki araçtaki değere benzer olmalıdır. Java numarası muhtemelen Android Monitoring'de gördüğünüz sayıyla tam olarak eşleşmese de yeni numara, Zygote'den çatallandığı için uygulamanızın Java yığınına ayrılmış tüm fiziksel bellek sayfalarını kapsar. Bu da uygulamanızın gerçekte ne kadar fiziksel bellek kullandığını doğru bir şekilde gösterir.
Bellek ayırmalarını görüntüle
Bellek ayırma işlemleri, belleğinizdeki her bir Java nesnesinin ve JNI referansının nasıl ayrıldığını gösterir. Bellek Profil Aracı özellikle nesne ayırmaları hakkında aşağıdakileri gösterebilir:
- Ne tür nesnelerin ayrıldığı ve bunların ne kadar alan kullandığı.
- Hangi iş parçacığında olduğu dahil olmak üzere her ayırmanın yığın izlemesi.
- Nesnelerin ayrılmış olması (yalnızca Android 8.0 veya sonraki sürümleri çalıştıran bir cihaz kullanılırken).
Java ve Kotlin ayırmalarını kaydetmek için Java / Kotlin ayırmalarını kaydet'i, ardından Kaydet'i seçin. Cihazda Android 8 veya sonraki bir sürüm kullanılıyorsa Bellek Profil Aracı kullanıcı arayüzü, devam eden kaydı gösteren ayrı bir ekrana geçer. Kaydın üzerindeki mini zaman çizelgesiyle etkileşim kurabilirsiniz (ör. seçim aralığını değiştirmek için). Kaydı tamamlamak için Durdur'u seçin.
Android 7.1 ve önceki sürümlerde bellek profil aracı, Durdur'u tıklayana kadar kaydı zaman çizelgesinde görüntüleyen eski ayırma kaydını kullanır.
Zaman çizelgesinde bir bölge seçtikten sonra (veya Android 7.1 ya da önceki sürümü çalıştıran bir cihazda kayıt oturumunu tamamladığınızda) ayrılan nesnelerin listesi, sınıf adına göre gruplandırılmış ve yığın sayılarına göre sıralanmış şekilde gösterilir.
Tahsis kaydını incelemek için şu adımları uygulayın:
- Yığın sayısı anormal derecede yüksek olan ve sızdırılmış olabilecek nesneleri bulmak için listeye göz atın. Bilinen sınıfları bulmanıza yardımcı olması için alfabetik olarak sıralamak üzere Sınıf Adı sütun başlığını tıklayın. Ardından bir sınıf adını tıklayın. Sağ tarafta, Şekil 3'te gösterildiği gibi, ilgili sınıfın her bir örneğini gösteren Örnek Görünümü bölmesi yer alır.
- Alternatif olarak, Filtre
düğmesini tıklayarak veya Control+F (Mac'te Command+F) tuşlarına basıp arama alanına bir sınıf ya da paket adı girerek nesneleri hızlıca bulabilirsiniz. Açılır menüden Çağrı yığınına göre düzenle'yi seçerseniz yöntem adına göre de arama yapabilirsiniz. Normal ifadeleri kullanmak istiyorsanız Regex'in yanındaki kutuyu işaretleyin. Arama sorgunuz büyük/küçük harfe duyarlıysa Büyük/küçük harf eşleştir'in yanındaki kutuyu işaretleyin.
- Alternatif olarak, Filtre
- Örnek Görünümü bölmesinde bir örneği tıklayın. Aşağıda Çağrı Yığını sekmesi görünür. Bu sekme, bu örneğin nerede ve hangi iş parçacığında tahsis edildiğini gösterir.
- Arama Grubu sekmesinde, herhangi bir satırı sağ tıklayın ve Kaynağa Atla'yı seçerek bu kodu düzenleyicide açın.
3. Şekil. Ayrılan her nesneyle ilgili ayrıntılar sağdaki Örnek Görünümü'nde gösterilir
Hangi yığının inceleneceğini ve verilerin nasıl düzenleneceğini seçmek için ayrılan nesneler listesinin üzerindeki iki menüyü kullanabilirsiniz.
Soldaki menüden incelenecek yığını seçin:
- varsayılan yığın: Sistem tarafından herhangi bir yığın belirtilmediğinde.
- görüntü yığını: Başlatma sırasında önceden yüklenen sınıfları içeren sistem önyükleme görüntüsü. Buradaki tahsislerin hiçbir zaman hareket etmemesi veya kaldırılmaması garanti edilir.
- zygote yığını: Android sistemindeki bir uygulama işleminin çatallandığı "yazarak kopyala" yığını.
- uygulama yığını: Uygulamanızın belleği ayırdığı birincil yığın.
- JNI yığını: Java Yerel Arayüzü (JNI) referanslarının nerede ayrıldığını ve nerede yayınlandığını gösteren yığın.
Sağdaki menüden ayırmaların nasıl düzenleneceğini seçin:
- Sınıfa göre düzenle: Tüm ayırmaları sınıf adına göre gruplandırır. Bu varsayılan seçenektir.
- Pakete göre düzenle: Tüm ayırmaları paket adına göre gruplandırır.
- Çağrı yığınına göre düzenle: Tüm ayırmaları ilgili çağrı yığınlarında gruplandırır.
Profil oluşturma sırasında uygulama performansını iyileştirme
Bellek profil aracı, profil oluşturma sırasında uygulama performansını iyileştirmek için varsayılan olarak bellek ayırmalarından düzenli aralıklarla örnekler alır. API düzeyi 26 veya üstünü çalıştıran cihazlarda test yaparken Atama İzleme açılır listesini kullanarak bu davranışı değiştirebilirsiniz. Mevcut seçenekler şunlardır:
- Tam: Bellekteki tüm nesne ayırmalarını yakalar. Bu, Android Studio 3.2 ve önceki sürümlerde varsayılan davranıştır. Çok sayıda nesne ayıran bir uygulamanız varsa profil çıkarma sırasında uygulamanızla birlikte gözle görülür yavaşlamalar gözlemleyebilirsiniz.
- Örneklenmiş: Bellekteki nesne ayırmalarını düzenli aralıklarla örnekler. Bu, varsayılan seçenektir ve profil çıkarma sırasında uygulama performansı üzerindeki etkisi daha azdır. Kısa süre içinde çok sayıda nesne ayıran uygulamalar gözle görülür yavaşlamalar gösterebilir.
- Kapalı: Uygulamanızın bellek tahsisini izlemeyi durdurur.
Global JNI referanslarını görüntüleyin
Java Yerel Arayüzü (JNI), Java kodu ile yerel kodun birbirini çağırmasını sağlayan bir çerçevedir.
JNI referansları yerel kod tarafından manuel olarak yönetildiğinden, yerel kod tarafından kullanılan Java nesnelerinin çok uzun süre canlı tutulması mümkündür. Bir JNI referansı açıkça silinmeden silinirse Java yığınındaki bazı nesnelere erişilemeyebilir. Ayrıca, global JNI referans sınırını aşmak da mümkündür.
Bu tür sorunları gidermek için Bellek Profil Aracı'nda JNI yığın görünümünü kullanarak tüm genel JNI referanslarına göz atın ve bunları Java türleri ve yerel çağrı yığınlarına göre filtreleyin. Bu bilgiler sayesinde, global JNI referanslarının ne zaman ve nerede oluşturulup silindiğini bulabilirsiniz.
Uygulamanız çalışırken, incelemek istediğiniz zaman çizelgesinin bir bölümünü ve sınıf listesinin üzerindeki açılır menüden JNI yığını'nı seçin. Daha sonra, yığındaki nesneleri normalde yaptığınız gibi inceleyebilir ve Şekil 4'te gösterildiği gibi JNI referanslarının nereye ayrıldığını ve kodunuzda serbest bırakıldığını görmek için Ayırma Çağrısı Yığını sekmesinde nesneleri çift tıklayabilirsiniz.
4. Şekil. Küresel JNI referanslarını görüntüleme
Uygulamanızın JNI kodu için bellek ayırmaları incelemek üzere uygulamanızı Android 8.0 veya sonraki sürümleri çalıştıran bir cihaza dağıtmanız gerekir.
JNI hakkında daha fazla bilgi için JNI ipuçlarını inceleyin.
Yerel Bellek Profil Aracı
Android Studio Bellek Profil Aracı, Android 10 çalıştıran fiziksel cihazlara dağıtılan uygulamalar için Yerel Bellek Profil Aracı içerir. Android 11 cihazlar için şu anda Android Studio 4.2 önizleme sürümünde destek sunulmaktadır.
Yerel Bellek Profil Aracı, belirli bir dönem için yerel koddaki nesnelerin ayırmalarını/ayırmalarını izler ve aşağıdaki bilgileri sağlar:
- Ayırmalar: Seçilen dönem boyunca
malloc()
veyanew
operatörü aracılığıyla ayrılan nesnelerin sayısıdır. - Anlaşma konumları: Seçilen dönem boyunca
free()
veyadelete
operatörü aracılığıyla dağıtılan nesnelerin sayısı. - Ayırma Boyutu: Seçilen dönem boyunca tüm ayırmaların bayt cinsinden birleştirilmiş boyutu.
- Anlaşma Boyutu: Seçilen dönem boyunca boşaltılan tüm belleğin bayt cinsinden toplam boyutu.
- Toplam Sayı: Allocations sütunundaki değerden Deallocations sütunundaki değerden çıkar.
- Kalan Boyut: Ayırma Boyutu sütunundaki değerden Deallocation Boyutu sütunundaki değer çıkar.
Android 10 ve sonraki sürümleri çalıştıran cihazlarda yerel ayırmaları kaydetmek için Yerel ayırmaları kaydet'i, ardından Kaydet'i seçin. Kayıt, Durdur
tıklanana kadar devam eder. Ardından Bellek Profil Aracı kullanıcı arayüzü, yerel kaydı gösteren ayrı bir ekrana geçer.
Android 9 ve önceki sürümlerde Yerel ayırmaları kaydet seçeneği kullanılamaz.
Varsayılan olarak Yerel Bellek Profil Aracı, 32 baytlık bir örnek boyutu kullanır: Her 32 bayt bellek ayrıldığında, belleğin anlık görüntüsü alınır. Örnek boyutu küçültüldüğünde anlık görüntülerin daha sık olması sağlanır ve bellek kullanımı hakkında daha doğru veriler elde edilir. Örnek boyutu ne kadar büyük olursa verilerin doğruluğu daha düşük olur, ancak sisteminizde daha az kaynak tüketir ve kayıt sırasında performansı artırır.
Yerel Bellek Profil Aracı'nın örnek boyutunu değiştirmek için:
- Çalıştır > Yapılandırmaları Düzenle'yi seçin.
- Sol bölmede uygulama modülünüzü seçin.
- Profil Oluşturma sekmesini tıklayın ve Yerel bellek örnekleme aralığı (bayt) etiketli alana örnek boyutunu girin.
- Uygulamanızı derleyip tekrar çalıştırın.
Yığın dökümü yakala
Yığın dökümü, yığın dökümünü yakaladığınız sırada uygulamanızdaki hangi nesnelerin belleği kullandığını gösterir. Özellikle uzun süreli kullanıcı oturumundan sonra yığın dökümü, hâlâ orada olmaması gerektiğini düşündüğünüz hâlâ bellekte olan nesneleri göstererek bellek sızıntılarını tanımlamaya yardımcı olabilir.
Yığın dökümü yakaladıktan sonra aşağıdakileri görüntüleyebilirsiniz:
- Uygulamanızın ne tür nesneler ayırdığı ve her birinden kaç tane nesne ayrıldığı.
- Her bir nesnenin ne kadar bellek kullandığı.
- Her bir nesneye yapılan referansların kodunuzda barındırıldığı konum.
- Bir nesnenin ayrıldığı çağrı yığını. (Çağrı yığınları şu anda yalnızca Android 7.1 ve önceki sürümlerde yığın dökümü ile kullanılabilir. Ayırmaları kaydederken yığın yığınını yakaladığınızda bu özellik kullanılabilir.)
Yığın dökümü yakalamak için Capture heap dump (Yığın dökümü yakala) seçeneğini tıklayın ve ardından Record (Kaydet) seçeneğini belirleyin. Yığın dökümü yapılırken Java bellek miktarı geçici olarak artabilir. Yığın dökümü uygulamanızla aynı süreçte gerçekleştiği ve veri toplamak için biraz bellek gerektirdiği için bu normaldir.
Profil düzenleyici, yığın dökümünü yakalamayı tamamladıktan sonra Bellek Profil Aracı kullanıcı arayüzü, yığın dökümünü gösteren ayrı bir ekrana geçiş yapar.
5.Şekil Yığın dökümü görüntüleniyor.
Dökümün ne zaman oluşturulduğu konusunda daha net olmanız gerekirse dumpHprofData()
yöntemini çağırarak uygulama kodunuzdaki kritik noktada yığın dökümü oluşturabilirsiniz.
Sınıf listesinde aşağıdaki bilgileri görebilirsiniz:
- Ayırmalar: Yığındaki ayırma sayısı.
Yerel Boyut: Bu nesne türü tarafından kullanılan toplam yerel bellek miktarı (bayt cinsinden). Bu sütun yalnızca Android 7.0 ve sonraki sürümler için görünür.
Android
Bitmap
gibi bazı çerçeve sınıflarında yerel bellek kullandığından Java'da ayrılan bazı nesnelere ait belleği burada görebilirsiniz.Sığ Boyut: Bu nesne türü tarafından kullanılan Java belleğinin toplam miktarı (bayt cinsinden).
Korunan Boyut: Bu sınıfın tüm örnekleri nedeniyle saklanan toplam bellek boyutu (bayt cinsinden).
Hangi yığın dökümlerinin inceleneceğini ve verilerin nasıl düzenleneceğini seçmek için ayrılan nesneler listesinin üzerindeki iki menüyü kullanabilirsiniz.
Soldaki menüden incelenecek yığını seçin:
- varsayılan yığın: Sistem tarafından herhangi bir yığın belirtilmediğinde.
- uygulama yığını: Uygulamanızın belleği ayırdığı birincil yığın.
- görüntü yığını: Başlatma sırasında önceden yüklenen sınıfları içeren sistem önyükleme görüntüsü. Buradaki tahsislerin hiçbir zaman hareket etmemesi veya kaldırılmaması garanti edilir.
- zygote yığını: Android sistemindeki bir uygulama işleminin çatallandığı "yazarak kopyala" yığını.
Sağdaki menüden ayırmaların nasıl düzenleneceğini seçin:
- Sınıfa göre düzenle: Tüm ayırmaları sınıf adına göre gruplandırır. Bu varsayılan seçenektir.
- Pakete göre düzenle: Tüm ayırmaları paket adına göre gruplandırır.
- Çağrı yığınına göre düzenle: Tüm ayırmaları ilgili çağrı yığınlarında gruplandırır. Bu seçenek yalnızca ayırmaları kaydederken yığın dökümünü yakalarsanız çalışır. Yine de, yığında kayda başlamanızdan önce ayrılmış nesneler olabilir. Bu nedenle, bu ayırmalar ilk sırada görünür ve yalnızca sınıf adına göre listelenir.
Liste, varsayılan olarak Korunan Boyut sütununa göre sıralanır. Farklı bir sütundaki değerlere göre sıralama yapmak için sütunun başlığını tıklayın.
Sağ taraftaki Örnek Görünümü penceresini açmak için bir sınıf adını tıklayın (şekil 6'da gösterilmiştir). Listelenen her örnek aşağıdakileri içerir:
- Derinlik: Herhangi bir GC kökünden seçilen örneğe 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ümler için görünür.
- Sığ Boyut: Bu örneğin Java belleğindeki boyutu.
- Tutulan Boyut: Bu örneğin hakim olduğu bellek boyutu (hakim ağacına göre).
6.Şekil Yığın dökümü yakalamak için gereken süre, zaman çizelgesinde
Yığınınızı incelemek için şu adımları uygulayın:
- Yığın sayısı anormal derecede yüksek olan ve sızdırılmış olabilecek nesneleri bulmak için listeye göz atın. Bilinen sınıfları bulmanıza yardımcı olması için alfabetik olarak sıralamak üzere Sınıf Adı sütun başlığını tıklayın. Ardından bir sınıf adını tıklayın. Sağ tarafta, Şekil 6'da gösterildiği gibi söz konusu sınıfın her bir örneğini gösteren Örnek Görünümü bölmesi yer alır.
- Alternatif olarak, Filtre
düğmesini tıklayarak veya Control+F (Mac'te Command+F) tuşlarına basıp arama alanına bir sınıf ya da paket adı girerek nesneleri hızlıca bulabilirsiniz. Açılır menüden Çağrı yığınına göre düzenle'yi seçerseniz yöntem adına göre de arama yapabilirsiniz. Normal ifadeleri kullanmak istiyorsanız Regex'in yanındaki kutuyu işaretleyin. Arama sorgunuz büyük/küçük harfe duyarlıysa Büyük/küçük harf eşleştir'in yanındaki kutuyu işaretleyin.
- Alternatif olarak, Filtre
- Örnek Görünümü bölmesinde bir örneği tıklayın. Aşağıda görünen Referanslar sekmesi, söz konusu nesneye yapılan tüm referansları gösterir.
Tüm alanlarını görüntülemek için örnek adının yanındaki oku ve ardından tüm referanslarını görüntülemek için bir alan adını tıklayın. Bir alanın örnek ayrıntılarını görüntülemek isterseniz alanı sağ tıklayın ve Örneğe Git'i seçin.
- Referanslar sekmesinde bellek sızıntısı olabilecek bir referans belirlerseniz ilgili referansı sağ tıklayın ve Örneğe Git'i seçin. Bu işlem, yığın dökümünden karşılık gelen örneği seçerek size kendi örnek verilerini gösterir.
Yığın dökümünüzde, aşağıdakilerden herhangi birinin neden olduğu bellek sızıntılarını arayın:
Activity
,Context
,View
,Drawable
veActivity
veyaContext
kapsayıcısına referans içerebilecek diğer nesnelere uzun ömürlü referanslar.Activity
örneği barındırabilenRunnable
gibi statik olmayan iç sınıflar.- Nesneleri gerekenden daha uzun süre tutan önbellekler.
Bellek yığını dökümünü HPROF dosyası olarak kaydetme
Bir yığın dökümü yakalandıktan sonra, veriler yalnızca profil aracı çalışırken Bellek Profil Aracı'nda görüntülenebilir. Profil oluşturma oturumundan çıktığınızda yığın dökümünü kaybedersiniz. Bu nedenle, yığın dökümünü daha sonra incelemek üzere kaydetmek
isterseniz bir HPROF dosyasına aktarın. Android Studio 3.1 ve önceki sürümlerde Yakalamayı dosyaya aktar
düğmesi, zaman çizelgesinin altındaki araç çubuğunun sol tarafında yer alır. Android Studio 3.2 ve sonraki sürümlerde ise Oturumlar bölmesindeki her Yığın Dökümü girişinin sağında bir Yığın Dökümü girişi bulunur. Görüntülenen Farklı Dışa Aktar iletişim kutusuna, dosyayı
.hprof
dosya adı uzantısıyla kaydedin.
jhat gibi farklı bir HPROF analiz aracı kullanmak için HPROF dosyasını Android biçiminden Java SE HPROF biçimine dönüştürmeniz gerekir.
Bu işlemi, android_sdk/platform-tools/
dizininde sunulan hprof-conv
aracını kullanarak yapabilirsiniz. hprof-conv
komutunu iki bağımsız değişkenle çalıştırın: orijinal HPROF dosyası ve dönüştürülen HPROF dosyasını yazacağınız konum. Örneğin:
hprof-conv heap-original.hprof heap-converted.hprof
Bellek yığını döküm dosyasını içe aktarma
Bir HPROF (.hprof
) dosyasını içe aktarmak için Oturumlar bölmesinde Yeni profil oluşturma oturumu başlat'ı tıklayın, Dosyadan yükle'yi seçin ve dosya tarayıcısından dosyayı seçin.
Bir HPROF dosyasını dosya tarayıcısından düzenleyici penceresine sürükleyerek de içe aktarabilirsiniz.
Bellek Profil Aracı'nda sızıntı algılama
Bellek Profil Aracı'nda yığın dökümünü analiz ederken Android Studio'nun uygulamanızdaki Activity
ve Fragment
örnekleri için bellek sızıntılarını gösterebileceğini düşündüğü profil oluşturma verilerini filtreleyebilirsiniz.
Filtrenin gösterdiği veri türleri şunlardır:
- Kaldırılmış ancak hâlâ referansta bulunan
Activity
örnek. - Geçerli bir
FragmentManager
içermeyen ancak hâlâ başvurulanFragment
örnekleri.
Aşağıdaki gibi belirli durumlarda filtre yanlış pozitif sonuçlar verebilir:
Fragment
oluşturuldu ancak henüz kullanılmadı.Fragment
önbelleğe alınıyor, ancak birFragmentTransaction
kapsamında değil.
Bu özelliği kullanmak için önce yığın dökümü yakalayın veya Android Studio'ya bir yığın dökümü dosyası içe aktarın. Bellek sızıntısı olabilecek parçaları ve etkinlikleri görüntülemek için Şekil 7'de gösterildiği gibi Bellek Profil Aracı'nın yığın dökümü bölmesinde Etkinlik/Parça Sızıntıları onay kutusunu seçin.
7. Şekil. Bellek sızıntıları için yığın dökümü filtreleniyor.
Belleğinizin profilini çıkarma teknikleri
Bellek Profil Aracı'nı kullanırken uygulama kodunuza baskı uygulamanız ve bellek sızıntılarını zorlamaya çalışmanız gerekir. Uygulamanızda bellek sızıntılarını tetiklemenin bir yolu, yığını denetlemeden önce bir süre çalıştırmaktır. Yığındaki tahsislerin en üstüne kadar sızıntılar sızabilir. Ancak sızıntı ne kadar küçük olursa uygulamayı görmek için o kadar uzun süre çalıştırmanız gerekir.
Bellek sızıntısını aşağıdaki yöntemlerden birini kullanarak da tetikleyebilirsiniz:
- Farklı etkinlik durumlarında cihazı dikey konumdan yatay yöne döndürün ve tekrar birkaç kez geri döndürün. Sistem,
Activity
öğesini yeniden oluşturduğundan ve uygulamanız bu nesnelerden birine başka bir yerde referans veriyorsa sistem genellikle cihazı döndürerekActivity
,Context
veyaView
nesnelerinin sızdırılmasına neden olabilir. - Farklı etkinlik durumlarındayken uygulamanız ile başka bir uygulama arasında geçiş yapın (Ana ekrana gidin, ardından uygulamanıza geri dönün).
İpucu: Monkeyrunner test çerçevesini kullanarak da yukarıdaki adımları uygulayabilirsiniz.