Bellek Profili Aracı ile uygulamanızın bellek kullanımını inceleme

Bellek Profil Aracı, Android Profiler'ın bellekteki sızıntıları ve bellek sızıntılarını tespit etmenize yardımcı olan, takılmaya, donmaya ve hatta uygulama kilitlenmelerine neden olabilen bir bileşendir. Uygulamanızın bellek kullanımını gerçek zamanlı olarak gösteren bir grafik; bellek yığını dökümünü yakalamanıza, çöp toplamayı zorunlu kılmanıza ve bellek ayırmalarını takip etmenize olanak tanır.

Bellek Profili Aracı'nı açmak için şu adımları uygulayın:

  1. Görünüm > Araç Pencereleri > Profil Aracı'nı tıklayın (araç çubuğunda Profil'i de tıklayabilirsiniz).
  2. Android Profilier araç çubuğundan, profil oluşturmak istediğiniz cihaz ve uygulama işlemini seçin. Bir cihazı USB üzerinden bağladıysanız ancak listede görmüyorsanız USB hata ayıklamayı etkinleştirdiğinizden emin olun.
  3. 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, ayrıca GC etkinliklerini logcat'te görebilirsiniz.

Uygulamanızın belleğini neden profilleştirmeniz gerekir?

Android, yönetilen bellek ortamı sağlar. Artık uygulamanızın bazı nesneleri kullanmadığı belirlendiğinde çöp toplayıcı, kullanılmayan belleği yığına serbest bırakır. Android, kullanılmayan belleği bulmak için sürekli olarak çalışıyor. Ancak bir noktada, tüm Android sürümlerinde sistemin kodunuzu kısa bir süreliğine duraklatması gerekecek. Çoğu zaman duraklamalar beklenemez. Bununla birlikte, uygulamanız belleği sistem tarafından toplayabileceğinden daha hızlı ayırırsa toplayıcı, ayırmalarınızı karşılamak için yeterli belleği serbest bırakırken 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östermiyor olsa bile, bellek sızdırıyorsa arka planda olsa bile bu anıyı saklayabilir. Bu davranış, gereksiz çöp toplama etkinliklerini zorlayarak sistemin geri kalan bellek performansını yavaşlatabilir. Sonuçta, sistem belleği geri kazanmak için uygulama işleminizi sonlandırmaya zorlanır. Ardından, kullanıcı uygulamanıza döndüğünde uygulama tamamen yeniden başlatılmalıdır.

Bu sorunları önlemeye yardımcı olması için aşağıdaki işlemleri yapmak üzere Bellek Profili Aracı'nı 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 tükettiğini görmek için Java yığınının dökümünü alın. Uzun süreli birkaç yığın dökümü bellek sızıntılarını belirlemeye yardımcı olabilir.
  • Kodunuzun kısa bir süre içinde çok fazla nesne ayırması veya sızdıran nesneleri tahsis etmesi için tam olarak nereye işaret ettiğini tespit etmek amacıyla, normal ve aşırı kullanıcı etkileşimi sırasında bellek ayırmalarını kaydedin.

Uygulamanızın belleğini azaltabilecek programlama uygulamaları hakkında bilgi için Uygulamanızın belleğini yönetme başlıklı makaleyi okuyun.

Bellek Profil Aracı'na genel bakış

Bellek Profil Aracı'nı ilk açtığınızda, çöp toplamayı zorunlu kılmak, bir yığın dökümü yakalamak ve bellek ayırmalarını kaydetmek için uygulamanızın bellek kullanımı ve erişim araçlarının ayrıntılı bir zaman çizelgesini görürsünüz.

Şekil 1. Bellek Profil Aracı

Şekil 1'de belirtildiği gibi, Bellek Profili Aracı için varsayılan görünüm aşağıdakileri içerir:

  1. Çöp toplama etkinliğini zorlamak için kullanılan bir düğme.
  2. Yığın dökümü yakalama düğmesi.

    Not: Yalnızca bellekte Android 7.1 (API düzeyi 25) veya daha düşük bir sürümü çalıştıran yığın dökümü düğmesinin sağ tarafında, bellek ayırmalarını kaydetmek için bir düğme görünür.

  3. Profil oluşturucunun bellek tahsislerini ne sıklıkta yakaladığını belirten bir açılır menü. Uygun seçeneği belirlemek, profil oluştururken uygulama performansını iyileştirmenize yardımcı olabilir.
  4. Zaman çizelgesini yakınlaştırma/uzaklaştırma düğmeleri.
  5. Canlı bellek verilerine atlama düğmesi.
  6. Etkinlik durumlarını, kullanıcı giriş etkinliklerini ve ekran döndürme etkinliklerini gösteren etkinlik zaman çizelgesi.
  7. Bellek kullanımı zaman çizelgesi. Bu zaman çizelgesi aşağıdakileri içerir:
    • Soldaki y ekseni ve üst kısımdaki renk anahtarıyla belirtildiği şekilde, her bellek kategorisi tarafından kullanılan bellek miktarını gösteren yığınlı grafik.
    • Kesikli çizgi, sağdaki y ekseninde de gösterilen, ayrılmış nesnelerin sayısını gösterir.
    • Her bir atık toplama etkinliğinin simgesi.

Ancak, Android 7.1 veya önceki bir sürümü kullanan bir cihaz kullanıyorsanız profil oluşturma verilerinin tümü varsayılan olarak görünmez. "Seçili işlemler için gelişmiş profilleme kullanılamıyor" şeklinde bir mesaj görürseniz aşağıdaki bilgileri görmek için gelişmiş profil oluşturmayı etkinleştirmeniz gerekir:

  • Etkinlik zaman çizelgesi
  • Ayrılmış nesnelerin sayısı
  • Çöp toplama etkinlikleri

Android 8.0 ve sonraki sürümlerde, hata ayıklamaya yönelik uygulamalar için gelişmiş profil oluşturma her zaman etkindir.

Bellek nasıl sayılır?

Android sistemine göre, Bellek Profili Aracı'nın üst kısmında gördüğünüz sayılar (Şekil 2) uygulamanızın taahhüt ettiği tüm özel bellek sayfalarını temel alır. Bu sayı, sistemle veya diğer uygulamalarla paylaşılan sayfaları içermez.

Şekil 2. Bellek Profili Aracı'nın üst kısmında bellek sayısı açıklaması

Anı sayısındaki kategoriler aşağıdaki gibidir:

  • Java: Java veya Kotlin kodundan ayrılan nesnelerin belleği.
  • Yerel: C veya C++ kodundan ayrılan nesnelerden bellek.

    Uygulamanızda C++ kullanmıyor olsanız bile, yazdığınız kod Java veya Kotlin dilinde olsa bile Android çerçevesi sizin adınıza çeşitli görevleri (ör. resim öğelerini ve diğer grafikleri işleme) gerçekleştirmek için yerel belleği kullandığından burada kullanılan bazı yerel belleği görebilirsiniz.

  • Grafikler: GL yüzeyler, GL dokuları vb. dahil olmak üzere pikselleri ekranda görüntülemek için grafik arabellek sıraları için kullanılan bellek. (Bunun CPU ile paylaşılan bellek olduğunu, özel GPU belleği olmadığını unutmayın.)

  • Yığın: Hem yerel hem de Java yığınları tarafından uygulamanızda kullanılan bellek. Bu genellikle uygulamanızın kaç tane mesaj dizisiyle çalıştığıyla ilgilidir.

  • Kod: Uygulamanızın kod ve kaynaklar (ör. dex bayt kodu, optimize edilmiş veya derlenmiş dex kodu, .so kitaplıkları ve yazı tipleri) için kullandığı bellek.

  • Diğerleri: Sistem tarafından nasıl kategorilere ayrılacağından emin olmayan uygulama tarafından kullanılan bellek.

  • Ayrılan: Uygulamanız tarafından ayrılan Java/Kotlin nesnelerinin sayısı. Bu, C veya C++ ile ayrılan nesneleri saymaz.

    Bu ayırma sayısı, Android 7.1 ve önceki bir sürümü çalıştıran bir cihaza bağlandığında yalnızca Bellek Profili Aracının çalışan uygulamanıza bağlandığı anda başlar. Bu nedenle, profil oluşturmaya başlamadan önce ayrılan nesneler dikkate alınmaz. Bununla birlikte, Android 8.0 ve sonraki sürümler, tüm ayırmaları takip eden bir cihaz profili profili içerir. Bu nedenle, bu sayı her zaman Android 8.0 ve sonraki sürümlerde uygulamanızda bekleyen Java nesnelerinin toplam sayısını temsil eder.

Önceki Android Monitor aracından alınan bellek sayılarıyla karşılaştırıldığında, yeni Bellek Profili Aracı, belleğinizi farklı şekilde kaydeder. Bu nedenle, bellek kullanımınız artık daha yüksek görünebilir. Bellek Profil Aracı, toplamı artıran bazı ek kategorileri izler, ancak yalnızca Java yığın belleğine önem veriyorsanız "Java" numarası önceki aracın değerine benzer olmalıdır. Java numarası muhtemelen Android Monitör'de gördüklerinizle tam olarak eşleşmese de yeni sayı, Zygote'den çatallandığı için uygulamanızın Java yığınına ayrılan tüm fiziksel bellek sayfalarını hesaba katar. Bu şekilde, uygulamanızın gerçekte ne kadar fiziksel bellek kullandığını doğru şekilde görebilirsiniz.

Bellek tahsislerini görüntüleme

Bellek ayırmaları, bellekinizdeki her Java nesnesinin ve JNI referansının nasıl ayrıldığını gösterir. Bellek Profilir, özellikle nesne ayırmalarla ilgili olarak aşağıdakileri gösterebilir:

  • Ne tür nesneler ayrıldığını ve ne kadar alan kullandıklarını gösterir.
  • Hangi iş parçacığının bulunduğu dahil olmak üzere her ayırmanın yığın izlemesi.
  • Nesnelerin tahsis edildiği zaman (yalnızca Android 8.0 veya sonraki sürüme sahip 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 çalışıyorsa Bellek Profili Aracı kullanıcı arayüzü, devam eden kaydı gösteren ayrı bir ekrana geçiş yapar. Kaydın üzerindeki mini zaman çizelgesiyle etkileşim kurabilirsiniz (örneğin, seçim aralığını değiştirmek için). Kaydı tamamlamak için Durdur'u seçin.

Bellek Profili Aracı'da Java ayırmalarının görselleştirilmesi

Android 7.1 ve önceki sürümlerde bellek profilleyici, eski ayırma kaydını kullanır. Bu kayıt, Durdur'u tıklayana kadar kaydı zaman çizelgesinde gösterir.

Zaman çizelgesi bölgesini seçtikten sonra (veya Android 7.1 veya önceki sürümleri çalıştıran bir cihazla kayıt oturumunu bitirdiğinizde), ayrılan nesnelerin listesi sınıf adına göre gruplandırılmış ve yığın sayısına göre sıralanır.

Ayırma kaydını incelemek için şu adımları uygulayın:

  1. Olağan dışı büyük yığın sayılarına sahip olan ve sızdırabilecek 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ğda Örnek Görünümü bölmesi gösterilir. Bu bölme, şekil 3'te gösterildiği gibi sınıfın her örneğini gösterir.
    • Alternatif olarak, Filtre'yi tıklayarak veya Control+F (Mac'te Command+F) tuşlarına basarak ve arama alanına bir sınıf ya da paket adı girerek nesneleri hızlı bir şekilde bulabilirsiniz. Açılır menüden Telefon numarası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.
  2. Örnek Görünümü bölmesinde bir örneği tıklayın. Aşağıda, örneğin nereye ayrıldığını ve hangi mesaj dizisinde olduğunu gösteren Çağrı Grubu sekmesi görünür.
  3. Çağrı Grubu sekmesinde herhangi bir satırı sağ tıklayın ve Kodu Atla'yı seçerek bu kodu düzenleyicide açın.

3. Şekil. Atanan her nesneyle ilgili ayrıntılar sağ taraftaki Örnek Görünümü'nde

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 hangi yığının inceleneceğini seçin:

  • varsayılan yığın: Sistem tarafından herhangi bir yığın belirtilmediğinde.
  • image_ap: Önyükleme sırasında önceden yüklenmiş sınıfları içeren sistem önyükleme resmi. Buradaki ayırmaların hiçbir zaman taşınmayacağı veya kaybolmayacağı garanti edilir.
  • zygote yığın: Android sisteminde uygulama işleminin çatallandığı üzerine yazma üzerine olan yığın.
  • uygulama yığını: Uygulamanızın bellek ayırdığı birincil yığın.
  • JNI yığını: Java Yerel Arayüzü (JNI) referanslarının tahsis edildiği ve yayınlandığı yeri gösteren yığın.

Sağdaki menüden ayırmaların nasıl düzenleneceğini seçin:

  • Sınıfa göre düzenleme: 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.
  • Callsack'e göre düzenle: Tüm ayırmaları ilgili çağrı yığınında gruplandırır.

Profil oluştururken uygulama performansını iyileştirin

Bellek profilleyici, profil oluşturma sırasında uygulama performansını iyileştirmek için bellek ayırmalarını varsayılan olarak düzenli aralıklarla örnekler. API düzeyi 26 veya üstünü çalıştıran cihazlarda test yaparken, Ayırma İzleme açılır menüsünü kullanarak bu davranışı değiştirebilirsiniz. Kullanabileceğiniz seçenekler aşağıdaki gibidir:

  • 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 oluştururken uygulamanızda görünür yavaşlamalar görebilirsiniz.
  • Örneklenmiş: Bellekteki nesne ayırmalarını düzenli aralıklarla örnekler. Bu, varsayılan seçenektir ve profil oluştururken uygulama performansını daha az etkiler. Kısa süre içinde çok sayıda nesne ayıran uygulamalarda görünür yavaşlamalar görülebilir.
  • Kapalı: Uygulamanızın bellek tahsisini izlemeyi durdurur.

Genel JNI referanslarını görüntüle

Java Yerel Arayüzü (JNI), Java kodu ile yerel kodun birbirlerini çağırmasına olanak tanıyan bir çerçevedir.

JNI referansları yerel kod tarafından manuel olarak yönetilir. Bu nedenle, yerel kod tarafından kullanılan Java nesnelerinin çok uzun süre canlı kalması 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ın tükenmesi de mümkündür.

Bu tür sorunları gidermek için Bellek Profili Aracı'ndaki JNI yığın görünümünü kullanarak tüm global JNI referanslarına göz atıp Java türleri ve yerel çağrı yığınlarına göre filtreleyebilirsiniz. Bu bilgilerle, global JNI referanslarının ne zaman ve nerede oluşturulduğunu ve silindiğini görebilirsiniz.

Uygulamanız çalışırken, zaman çizelgesinin incelemek istediğiniz bölümünü seçin ve sınıf listesinin üst kısmındaki açılır menüden JNI yığın seçeneğini belirleyin. Daha sonra, yığındaki nesneleri normalde yaptığınız gibi inceleyebilir ve NI Calling Stack (Ayırma Çağrısı) sekmesindeki nesneleri, Şekil 4'te gösterildiği gibi kodunuzdaki JNI referanslarının nerede ayrılıp ayrıldığını görmek için çift tıklayabilirsiniz.

4. Şekil. Global JNI referanslarını görüntüleme

Uygulamanızın JNI koduna ait bellek ayırmalarını incelemek için uygulamanızı Android 8.0 veya sonraki bir sürümü çalıştıran bir cihaza dağıtmanız gerekir.

JNI hakkında daha fazla bilgi için JNI ipuçları konusuna bakın.

Yerel Bellek Profilcisi

Android Studio Bellek Profil Aracı, Android 10 çalıştıran fiziksel cihazlara dağıtılan uygulamalar için Yerel Bellek Profilleyici içerir. Android 11 cihazlar için destek şu anda Android Studio 4.2 önizleme sürümünde sağlanmaktadır.

Yerel Bellek Profili Aracı, belirli bir zaman dilimi için yerel kodda nesnelerin ayırmalarını/ayırmalarını izler ve aşağıdaki bilgileri sağlar:

  • Tahsisler: Seçilen dönem boyunca malloc() veya new operatörü aracılığıyla ayrılan nesnelerin sayısı.
  • Anlaşma konumları: Seçilen dönem boyunca free() veya delete operatörü aracılığıyla tanımlanan anlaşma sayısı.
  • Tahsis Boyutu: Seçilen dönemde tüm ayırmaların bayt cinsinden toplam boyutu.
  • Anlaşma Konumları Boyutu: Seçilen dönem boyunca, boş olan tüm belleklerin bayt cinsinden toplam boyutu.
  • Toplam Sayısı: Tahsisler sütunundaki değer eksi Anlaşma Konumları sütunundaki değer eksi.
  • Kalan Boyut: Ayırma Boyutu sütunundaki değer eksi Anlaşma Konumu Boyutu sütunundaki değer eksi.

Yerel Bellek Profilcisi

Android 10 ve sonraki sürümleri çalıştıran cihazlarda yerel ayırmaları kaydetmek için Yerel ayırmaları kaydet'i ve ardından Kaydet'i seçin. Siz Durdur'u tıklayana kadar kayıt devam eder, ardından Bellek Profili Aracı kullanıcı arayüzü yerel kaydı gösteren ayrı bir ekrana geçer.

Yerel ayırmaları kaydet düğmesi

Android 9 ve önceki sürümlerde Yerel ayırmaları kaydet seçeneği kullanılamaz.

Varsayılan olarak Yerel Bellek Profili Aracı, 32 baytlık örnek boyutu kullanır: 32 baytlık bellek her ayrıldığında bellek anlık görüntüsü alınır. Örnek boyutunun küçültülmesi daha sık anlık görüntü alınmasını sağlayarak bellek kullanımı hakkında daha doğru veriler sunar. Daha büyük örnek boyutu, daha az doğru veri sağlar ancak sisteminizde daha az kaynak tüketir ve kayıt sırasında performansı artırır.

Yerel Bellek Profilcisi'nin örnek boyutunu değiştirmek için:

  1. Çalıştır > Yapılandırmaları Düzenle'yi seçin.
  2. Sol bölmede uygulama modülünüzü seçin.
  3. Profil oluşturma sekmesini tıklayın ve Yerel bellek örnekleme aralığı (bayt) etiketli alana örnek boyutunu girin.
  4. Uygulamanızı derleyip tekrar çalıştırın.

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

Yığın dökümü, yığın dökümü yakalarken uygulamanızdaki hangi nesnelerin bellek kullandığını gösterir. Yığın dökümü, özellikle uzun bir kullanıcı oturumundan sonra, hâlâ mevcut olmadığını düşündüğünüz bellekte olan nesneleri göstererek bellek sızıntılarını tespit etmenize 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 bunların her birinden kaç adet olduğu.
  • Her bir nesnenin ne kadar bellek kullandığı.
  • Kodunuzda her bir nesneye yönelik referansların bulunduğu yer.
  • Bir nesnenin ayrıldığı çağrı yığını. (Arama yığınları, şu anda ayırmaları kaydederken yığın dökümünü yakaladığınızda yalnızca Android 7.1 ve önceki sürümlerde yığın dökümüyle kullanılabilir.)

Yığın dökümü yakalamak için yığın dökümü yakala'yı tıklayın ve Kaydet'i seçin. Yığın boşaltılırken Java belleği miktarı geçici olarak artabilir. Yığın dökümü, uygulamanızla aynı işlemde gerçekleştiği ve verileri toplamak için bir miktar bellek gerektirdiğinden bu normaldir.

Profil oluşturucunın yığın dökümünü yakalamayı bitirdikten sonra, Bellek Profili 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österiliyor.

Dökümün ne zaman oluşturulduğu konusunda daha hassas olmanız gerekiyorsa dumpHprofData() çağırarak uygulama kodunuzdaki kritik noktada bir yığın dökümü oluşturabilirsiniz.

Sınıflar listesinde aşağıdaki bilgileri görebilirsiniz:

  • Tahsisler: 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ümlerde görülebilir.

    Android, Bitmap gibi bazı çerçeve sınıfları için yerel bellek kullandığından Java'da ayrılan bazı nesneler için burada belleği görürsünüz.

  • Yüzey Boyutu: Bu nesne türü tarafından kullanılan toplam Java belleği miktarı (bayt cinsinden).

  • Salanan Boyut: Bu sınıfın tüm örnekleri nedeniyle tutulan belleğin toplam boyutu (bayt cinsinden).

Ayrılan nesneler listesinin üzerindeki iki menüyü kullanarak, hangi yığın dökümlerinin inceleneceğini ve verilerin nasıl düzenleneceğini seçebilirsiniz.

Soldaki menüden hangi yığının inceleneceğini seçin:

  • varsayılan yığın: Sistem tarafından herhangi bir yığın belirtilmediğinde.
  • uygulama yığını: Uygulamanızın bellek ayırdığı birincil yığın.
  • image_ap: Önyükleme sırasında önceden yüklenmiş sınıfları içeren sistem önyükleme resmi. Buradaki ayırmaların hiçbir zaman taşınmayacağı veya kaybolmayacağı garanti edilir.
  • zygote yığın: Android sisteminde uygulama işleminin çatallandığı üzerine yazma üzerine olan yığın.

Sağdaki menüden ayırmaların nasıl düzenleneceğini seçin:

  • Sınıfa göre düzenleme: 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.
  • Callsack'e göre düzenle: Tüm ayırmaları ilgili çağrı yığınında gruplandırır. Bu seçenek yalnızca ayırmaları kaydederken yığın dökümünü yakalarsanız çalışır. Bununla birlikte, kaydetmeye başlamadan önce tahsis edilen yığında nesneler olabilir. Dolayısıyla bu ayırmalar, ilk olarak sınıf adına göre sıralanmış şekilde gösterilir.

Liste varsayılan olarak Elde Tutulan 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 yapılan 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ülebilir.
  • Yüzey Boyutu: Bu örneğin Java belleğindeki boyutu.
  • Elde Tutulan Boyut: Bu örneğin hakim olduğu bellek boyutu (eminlik 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 aşağıdaki adımları uygulayın:

  1. Olağan dışı büyük yığın sayılarına sahip olan ve sızdırabilecek 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 Örnek Görünümü bölmesi gösterilir. Bu bölme, Şekil 6'da gösterildiği gibi sınıfın her örneğini gösterir.
    • Alternatif olarak, Filtre'yi tıklayarak veya Control+F (Mac'te Command+F) tuşlarına basarak ve arama alanına bir sınıf ya da paket adı girerek nesneleri hızlı bir şekilde bulabilirsiniz. Açılır menüden Telefon numarası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.
  2. Örnek Görünümü bölmesinde bir örneği tıklayın. Aşağıda, Referanslar sekmesi bu nesneye yapılan her referansı 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 istiyorsanız alanı sağ tıklayın ve Örneğe Git'i seçin.

  3. Referanslar sekmesinde, bellekten kaçabilecek bir referans görürseniz sağ tıklayın ve Örneğe Git'i seçin. Bu işlem, yığın dökümünden ilgili örneği seçer ve 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 ve Activity veya Context kapsayıcısına atıfta bulunabilecek diğer nesnelere uzun süreli referanslar.
  • Activity örneğinin bulunabileceği, Runnable gibi statik olmayan dahili sınıflar.
  • Nesneleri gerekenden uzun tutan önbellekler.

Yığın dökümünü HPROF dosyası olarak kaydedin

Yığın dökümü yakalandıktan sonra veriler yalnızca profil oluşturucu çalışırken Bellek Profil Aracı'nda görüntülenebilir. Profil oluşturma oturumundan çıktığınızda, yığın dökümü kaybedilir. Dolayısıyla, daha sonra incelenmek üzere kaydetmek için yığın dökümünü 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ındadır; Android Studio 3.2 ve sonraki sürümlerde, Oturumlar bölmesindeki her yığın dökümü dışa aktarma düğmesinin sağ tarafında bir Toplu Döküm Dışa Aktar düğmesi bulunur. Açılan Farklı Dışa Aktar iletişim kutusunda, 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 sağlanan hprof-conv aracıyla 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ın yazılacağı konum. Örnek:

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

Yığın döküm dosyasını içe aktar

Bir HPROF (.hprof) dosyasını içe aktarmak için Yeni bir profil oturumu başlatın Oturumlar bölmesinde Dosyadan yükle'yi 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 Profiler'da sızıntı algılama

Bellek Profiler'daki bir yığın dökümü analiz edilirken Android Studio'nun uygulamanızdaki Activity ve Fragment örneklerinde bellek sızıntılarını işaret edebileceğini düşündüğü profil oluşturma verilerini filtreleyebilirsiniz.

Filtrenin gösterdiği veri türleri şunları içerir:

  • İmha edilen ancak hâlâ referans verilen Activity örnek.
  • Geçerli bir FragmentManager içermeyen ancak referans verilen Fragment örnek.

Aşağıdaki gibi belirli durumlarda filtre, yanlış pozitif sonuçlar verebilir:

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

Bu özelliği kullanmak için önce Android Studio'ya bir yığın dökümü yakalayın veya bir yığın dökümü dosyasını içe aktarın. Anıyı sızdırabilecek parçaları ve etkinlikleri görüntülemek için Şekil 7'de gösterildiği gibi Bellek Profili Aracı'nın yığın dökümü bölmesinde Etkinlik/Parça Sızıntıları onay kutusunu seçin.

Profil Aracı: Bellek Sızıntısı Algılama

Şekil 7. Bellek sızıntısı için yığın dökümü filtreleme.

Anılarınızı profil çıkarma teknikleri

Bellek Profili Aracı'nı kullanırken uygulama kodunuzu vurgulamanız ve bellek sızıntılarını zorlamayı denemeniz gerekir. Uygulamanızdaki bellek sızıntılarını kışkırtmanın bir yolu, yığını incelemeden önce bir süre çalıştırmaktır. Sızıntılar yığındaki ayırmaların üst kısmına çıkabilir. Ancak sızıntı ne kadar küçükse görmek için uygulamayı çalıştırmanız da o kadar uzun sürer.

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

  • Cihazı dikey moddan yatay yöne döndürün ve farklı etkinlik durumlarında birkaç kez geri alın. Cihazın döndürülmesi genellikle bir uygulamanın Activity, Context veya View nesnesini sızdırmasına neden olabilir. Bunun nedeni, sistemin Activity öğesini yeniden oluşturması ve uygulamanızın bu nesnelerden birine referansın başka bir yerde bulunması halinde, sistemin çöp toplama işlemini toplayamamasıdır.
  • Farklı etkinlik durumlarında uygulamanız ile başka bir uygulama arasında geçiş yapın (Ana ekrana gidin ve uygulamanıza dönün).

İpucu: Yukarıdaki adımları monkeyrunner test çerçevesini kullanarak da yapabilirsiniz.