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

Android Profiler'da bulunan ve takılmaya, donmaya, 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ıyla ilgili gerçek zamanlı bir grafik gösterir ve 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:

  1. Görünüm > Araç Pencereleri > Profil Aracı'nı tıklayın (araç çubuğundan Profil simgesini de tıklayabilirsiniz).
  2. Android Profiler araç çubuğundan, profilini çıkarmak 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ıklamasını etkinleştirdiğinizden emin olun.
  3. Bellek Profil Aracı'nı açmak için BELLEK zaman çizelgesinde herhangi bir yeri tıklayın.

Alternatif olarak, uygulama belleğinizi komut satırından dumpsys ile inceleyebilir ve logcat'te GC etkinliklerini inceleyebilirsiniz.

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

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 bulmaya yönelik çalışmaları sürekli olarak iyileştirilmektedir ancak tüm Android sürümlerinde bir noktada sistemin kodunuzu kısa bir süreliğine duraklatması gerekir. Duraklamalar çoğu zaman anlamsızdır. Bununla birlikte, uygulamanız belleği, sistemin toplayabileceğinden daha hızlı ayırırsa toplayıcı, ayırmalarınızı karşılamak için yeterli belleği 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ızdırması durumunda arka plandayken bile bu belleği koruyabilir. Bu davranış, gereksiz çöp toplama etkinliklerini zorlayarak sistemin geri kalanının bellek performansını yavaşlatabilir. En sonunda 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ın önlenmesine yardımcı olmak için Bellek Profil Aracı'nı kullanarak aşağıdakileri yapabilirsiniz:

  • 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ın dökümünü alın. Uzun süre boyunca gerçekleşen birkaç yığın dökümü, bellek sızıntılarını tanımlamaya yardımcı olabilir.
  • Normal ve aşırı kullanıcı etkileşimleri sırasında kodunuzun tam olarak nerede çok kısa bir süre içinde çok sayıda nesne ayırdığını veya sızdırılan nesneleri ayırdığını tanımlamak için bellek ayırmalarını kaydedin.

Uygulamanızın bellek kullanımını azaltabilecek programlama yöntemleri hakkında bilgi için Uygulamanızın belleğini yönetme bölümünü okuyun.

Bellek Profil Aracı'na genel bakış

Bellek Profil Aracı'nı ilk kez açtığınızda, uygulamanızın bellek kullanımıyla ilgili ayrıntılı bir zaman çizelgesini görürsünüz. Ayrıca çöp toplamaya zorlama, yığın dökümü yakalamaya ve bellek ayırmalarını kaydetmeye yönelik araçlara erişim sağlanır.

Şekil 1. Bellek Profil Aracı

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

  1. Atık toplama etkinliğini zorunlu kılan bir düğme.
  2. Yığın dökümü yakalama düğmesi.

    Not: Bellek ayırmalarını 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.

  3. Profil oluşturucunun bellek ayırmaları ne sıklıkta yakalayacağı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.
  4. Zaman çizelgesini yakınlaştırma/uzaklaştırma düğmeleri.
  5. Canlı bellek verilerine atlamak için kullanılabilecek bir düğme.
  6. Etkinlik durumlarını, kullanıcı giriş etkinliklerini ve ekran rotasyonu etkinliklerini gösteren etkinlik zaman çizelgesi.
  7. Aşağıdakileri içeren bellek kullanımı zaman çizelgesi:
    • Soldaki y ekseni ve üstteki renk anahtarı ile belirtilen şekilde her bellek kategorisinin ne kadar bellek kullandığını gösteren yığınlı grafik.
    • Kesikli çizgi, sağdaki y ekseniyle belirtilen şekilde ayrılan nesne 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çili 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ı
  • Çöp toplama etkinlikleri

Android 8.0 ve sonraki sürümlerde, hata ayıklaması yapılabilir 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ılmış nesnelere ait bellek.
  • Yerel: C veya C++ kodundan ayrılmış nesnelerdeki bellek.

    Uygulamanızda C++ kullanmıyor olsanız bile Android çerçevesinin, resim öğelerini veya diğer grafikleri işleme gibi çeşitli görevleri sizin adınıza yerine getirmek için yerel bellekten yararlandığını görebilirsiniz. Bu durum, yazdığınız kod Java veya Kotlin'de olsa bile geçerlidir.

  • 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ızdaki hem yerel hem de Java yığınları tarafından kullanılan bellek. Bu genellikle uygulamanızın çalıştırdığı iş parçacığı sayısıyla ilişkilidir.

  • 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 kullandığı, sistemin nasıl kategorize edeceğinden emin olmadığı bellek.

  • Ayrılan: Uygulamanız tarafından ayrılan Java/Kotlin nesnelerinin sayısı. C veya C++'ta ayrılan nesneleri içermez.

    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ığında 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ı izleyen bir cihaz üzerinde profil oluşturma aracı içerir. Dolayısıyla bu sayı her zaman, Android 8.0 ve sonraki sürümlerdeki uygulamanızda bekleyen Java nesnelerinin toplam sayısını gösterir.

Yeni Bellek Profil Aracı, önceki Android Monitor aracındaki bellek sayısı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ı ek kategorileri izler ancak yalnızca Java yığın belleğiyle ilgileniyorsanız "Java" sayısı bir önceki araçtaki değere benzer olmalıdır. Java numarası muhtemelen Android Monitor'da gördüğünüzle tam olarak eşleşmese de, yeni numara Zygote'tan çatallandığı için uygulamanızın Java yığınına ayrılmış tüm fiziksel bellek sayfalarını kapsar. Dolayısıyla bu, uygulamanızın gerçekte ne kadar fiziksel bellek kullandığını doğru bir şekilde gösterir.

Bellek ayırmalarını görüntüleme

Bellek ayırmaları, belleğinizdeki her bir Java nesnesi 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 ne kadar alan kullandıkları.
  • Hangi iş parçacığının içinde olduğu da 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 (örneğin, seçim aralığını değiştirmek için). Kaydı tamamlamak için Durdur'u seçin.

Bellek Profil Aracı'nda Java tahsislerinin görselleştirilmesi

Android 7.1 ve önceki sürümlerde bellek profil aracı, siz Durdur'u tıklayana kadar kaydı zaman çizelgesinde görüntüleyen eski ayırma kaydını kullanır.

Zaman çizelgesinin bir bölgesini seçtikten sonra (veya Android 7.1 ya da önceki sürümü çalıştıran bir cihazda kayıt oturumunu bitirdikten sonra), ayrılan nesnelerin listesi sınıf adına göre gruplandırılmış ve yığın sayısına göre sıralanmış şekilde görüntülenir.

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

  1. Yığın sayıları 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. Şekil 3'te gösterildiği gibi, sağ tarafta bu sınıfın her bir örneğini gösteren Örnek Görünümü bölmesi görüntülenir.
    • Alternatif olarak, Filtre düğmesini 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 Çağrı kümesine 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 görünen Çağrı Yığını sekmesi, örneğin nerede ve hangi iş parçacığında tahsis edildiğini gösterir.
  3. Arama Yığını sekmesinde, herhangi bir satırı sağ tıklayın ve Kaynağa Atla'yı seçerek ilgili kodu düzenleyicide açın.

3. Şekil. Ayrılmış her bir 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 üstündeki iki menüyü kullanabilirsiniz.

Soldaki menüden incelenecek yığını seçin:

  • varsayılan yığın: Sistem tarafından hiçbir yığın belirtilmediğinde.
  • image yığın: Başlatma sırasında önceden yüklenen sınıfları içeren sistem başlatma görüntüsü. Burada yapılan ayırmaların hiçbir zaman taşınmayacağı veya kaybolmayacağı garanti edilmiştir.
  • zygote yığını: Android sisteminde bir uygulama işleminin çatallandığı "yazılırken kopyala" yığını.
  • uygulama yığını: Uygulamanızın bellek ayırdığı birincil yığın.
  • JNI yığını: Java Yerel Arayüzü (JNI) başvurularının nerede ayrıldığını ve 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ştururken 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ını düzenli aralıklarla örnekler. API düzeyi 26 veya üstünü çalıştıran cihazlarda test yaparken Ayırma İzleme açılır listesini kullanarak bu davranışı değiştirebilirsiniz. Mevcut 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 çıkarma sırasında uygulamanızda 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 bir süre içinde çok fazla nesne ayıran uygulamalar gözle görülür yavaşlamalar sergileyebilir.
  • 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önetilir. Bu nedenle, yerel kod tarafından kullanılan Java nesnelerinin çok uzun süre aktif kalması mümkündür. Bir JNI referansı açıkça silinmeden silinirse Java yığınındaki bazı nesnelere erişilemeyebilir. Ayrıca, küresel JNI referans sınırını aşmak da mümkündür.

Bu tür sorunları gidermek amacıyla tüm genel JNI referanslarına göz atmak ve bunları Java türleri ile yerel çağrı yığınlarına göre filtrelemek için Bellek Profil Aracı'nda JNI yığın görünümünü kullanın. Bu bilgiler sayesinde, genel JNI referanslarının ne zaman ve nerede oluşturulup silindiğini öğrenebilirsiniz.

Uygulamanız çalışırken, zaman çizelgesinin incelemek istediğiniz bölümünü seçin ve sınıf listesinin üzerindeki açılır menüden JNI yığını seçeneğini belirleyin. Daha sonra, yığındaki nesneleri normalde yaptığınız gibi inceleyebilir ve Şekil 4'te gösterildiği gibi Ayırma Çağrı Yığını sekmesinde nesneleri çift tıklayarak JNI referanslarının nerede ayrıldığını ve kodunuzda nerede serbest bırakıldığını görebilirsiniz.

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

Uygulamanızın JNI kodu için bellek tahsislerini 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ı bölümüne bakın.

Yerel Bellek Profil Aracı

Android Studio Bellek Profil Aracı, Android 10 ve sonraki sürümleri çalıştıran fiziksel ve sanal cihazlara dağıtılan uygulamalar için Yerel Bellek Profil Aracı içerir.

Yerel Bellek Profil Aracı, yerel koddaki nesnelerin belirli bir dönem için tahsislerini/ayırmalarını izler ve aşağıdaki bilgileri sağlar:

  • Ayırmalar: 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 dağıtılan nesnelerin sayısı.
  • Ayırma Boyutu: Seçilen dönem boyunca tüm ayırmaların bayt cinsinden toplam boyutu.
  • Anlaşma Konumu Boyutu: Seçilen dönem boyunca boşaltılan tüm belleğin bayt cinsinden toplam boyutu.
  • Toplam Sayım: Allocations sütunundaki değerden Deallocations sütunundaki değerin çıkarılmasıyla elde edilen değer.
  • Kalan Boyut: Ayırma Boyutu sütunundaki değer eksi Deallocations Boyutu sütunundaki değer.

Yerel Bellek Profil Aracı

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, siz Durdur düğmesini tıklayana kadar devam eder. Ardından Bellek Profil 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 Profil Aracı 32 baytlık bir örnek boyutu kullanır: Her 32 baytlık bellek ayrıldığında, belleğin anlık görüntüsü alınır. Örnek boyutu küçüldükçe daha sık anlık görüntüler elde edilir 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 kayıt sırasında sisteminizde daha az kaynak tüketir ve performansı artırır.

Yerel Bellek Profil Aracının örnek boyutunu değiştirmek için:

  1. Çalıştır > Yapılandırmaları Düzenle'yi seçin.
  2. Sol bölmeden 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ı yeniden derleyip çalıştırın.

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

Yığın dökümü, bellek 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 bellek sızıntısı, bellek sızıntılarının tespit edilmesine yardımcı olabilir. Bu işlem, bellekte bulunan ve artık bulunmaması gerektiğini düşündüğünüz nesneleri gösterir.

Bellek yığını dökümünü 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.
  • 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ı. (Arama 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 dökümünü yakaladığınızda, bu özellik şu anda yalnızca Android 7.1 ve önceki sürümlerde kullanılabilir.)

Bellek yığını dökümünü kaydetmek için Yığın dökümünü yakala öğesini tıklayın ve ardından Kaydet'i seçin. 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 normal bir durumdur.

Profil oluşturucu, yığın dökümünü yakalamayı bitirdikten 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 kodunuzun kritik noktasında bellek yığını dökümü oluşturabilirsiniz.

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

  • Ayırmalar: Yığındaki ayırmaların 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ünür.

    Android, Bitmap gibi bazı çerçeve sınıflarında yerel bellek kullandığından Java'da ayrılmış bazı nesneler için belleği burada görebilirsiniz.

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

  • Korunan Boyut: Bu sınıfın tüm örnekleri nedeniyle saklanan belleğin toplam 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 üstündeki iki menüyü kullanabilirsiniz.

Soldaki menüden incelenecek yığını seçin:

  • varsayılan yığın: Sistem tarafından hiçbir yığın belirtilmediğinde.
  • uygulama yığını: Uygulamanızın bellek ayırdığı birincil yığın.
  • image yığın: Başlatma sırasında önceden yüklenen sınıfları içeren sistem başlatma görüntüsü. Burada yapılan ayırmaların hiçbir zaman taşınmayacağı veya kaybolmayacağı garanti edilmiştir.
  • zygote yığını: Android sisteminde bir uygulama işleminin çatallandığı "yazılırken 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 kayda başlamanızdan önce yığında ayrılmış nesneler olabilir. Bu nedenle, bu ayırmalar önce sınıf adına göre listelenerek gösterilir.

Liste, varsayılan olarak Korunan Boyut sütununa göre sıralanır. Farklı bir sütundaki değerlere göre sıralamak 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österilmektedir). Listelenen her örnek aşağıdakileri içerir:

  • Derinlik: Herhangi bir GC kökünden seçilen örneğe kadar 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ünür.
  • Sığ Boyut: Bu örneğin Java belleğindeki boyutu.
  • Korunan Boyut: Bu örneğin baskın 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 belirtilir

Yığınınızı incelemek için şu adımları uygulayın:

  1. Yığın sayıları 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. Şekil 6'da gösterildiği gibi, sağda ilgili sınıfın her bir örneğini gösteren Örnek Görünümü bölmesi görüntülenir.
    • Alternatif olarak, Filtre düğmesini 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 Çağrı kümesine 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 görüntülenerek söz konusu nesneye her referans gösterilir.

    Alternatif olarak, örnek adının yanındaki oku tıklayarak tüm alanlarını görüntüleyin ve ardından bir alan adını tıklayarak tüm referansları görüntüleyin. 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.

  3. Referanslar sekmesinde, bellek sızıntısı olabilecek bir referans tanımlarsanız ilgili referansı sağ tıklayın ve Örneğe Git'i seçin. 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 ve Activity veya Context kapsayıcısına referans içerebilecek diğer nesnelere uzun ömürlü referanslar.
  • Activity örneği barındırabilen Runnable 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 kaydet

Bir bellek 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, bellek yığını dökümünü daha sonra incelemek üzere kaydetmek için 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 bir Yığın Dökümü girişinin sağında bir Yığın Dökümünü Dışa Aktar düğmesi vardır. Görüntülenen 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ı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ın yazılacağı konum. Örnek:

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 bir profil oluşturma oturumu başlat 'ı tıklayın, Dosyadan yükle'yi seçin ve dosya tarayıcısından dosyayı seçin.

Ayrıca, 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 bir 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 aşağıdakileri içerir:

  • İmha edilmiş ancak hâlâ referansta bulunulan Activity örnek.
  • Geçerli bir FragmentManager içermeyen, ancak hâlâ başvurulan Fragment ö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 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. Bellek sızdırıyor 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ölmesindeki Etkinlik/Parça Sızıntıları onay kutusunu seçin.

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

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

Hafızanızın profilini çıkarma teknikleri

Bellek Profil Aracı'nı kullanırken uygulama kodunuza baskı uygulamalı ve bellek sızıntılarını zorlamayı denemelisiniz. Uygulamanızda bellek sızıntılarını tetiklemenin 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 kadar sızabilir. Ancak sızıntı ne kadar küçükse uygulamayı görmek için o kadar uzun süre çalıştırmanız gerekir.

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

  • Farklı etkinlik durumundayken cihazı dikey konumdan yatay yöne doğru birkaç kez döndürün. Sistem, Activity öğesini yeniden oluşturduğundan ve uygulamanız bu nesnelerden birine başka bir yerde referans verirse sistem, öğeyi çöplerle toplayamaz. Bunun nedeni, cihazın döndürülmesi genellikle uygulamaların Activity, Context veya View nesnelerini sızdırması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 dönün).

İpucu: Monkeyrunner test çerçevesini kullanarak da yukarıdaki adımları uygulayabilirsiniz.