Profil türleri ve her birinin ne zaman faydalı olduğu

Android'de çeşitli performans profilleri kaydedebilirsiniz. Profil toplamak, uygulamanızın çalışma hızı, kullandığı bellek miktarı, tükettiği güç miktarı ve daha fazlasıyla ilgili sorunları ayıklamanıza yardımcı olur.

Bu belgede, en kullanışlı profil türleri ve yaygın performans sorunlarında hata ayıklamak için her birinin ne zaman kullanılacağı açıklanmaktadır.

Sistem izleri

Sistem izleme örneği
1.şekil: Sistem İzleme örneği.

Sistem izi, süreçler, iş parçacıkları, zamanlama bilgileri, CPU ve görev yürütme ile sistem veya kullanıcı tanımlı etkinlikler hakkında bilgi içeren güçlü bir profildir.

Uygulama açısından izlerdeki bilgilerin niteliği; gecikme, takılma, bellek, pil gibi çok çeşitli alanları kapsayabilir.

Sistem izleri, sistem veya kullanıcı tanımlı olabilen aşağıdaki kod odaklı etkinlikleri içerir. Koda dayalı etkinlikler, kullanıcıların işlev çağrıları aracılığıyla tetikleyebileceği etkinliklerdir.

  • İzleme dilimleri: Kodunuzdaki farklı noktalar arasındaki süreyi gösterir. Trace.beginSection ve Trace.endSection API'leri ile eklenebilir.
  • İzleme sayaçları: Metrikleri temsil eden sayısal değerler (ör. yığın boyutu). Trace.setCounter API ile eklenebilirler.

Sistem izleri, PerfettoSQL sorgularından oluşturulabilen ve analiz yapmak veya izleri karşılaştırmak için kullanılabilen metrikler de içerir.

Aşağıdaki görevleri gerçekleştirmek için sistem izlerini kullanmanızı öneririz:

  • Gecikme sorunlarını teşhis edin. Sistem izleri, gecikmelerden, beklemelerden veya planlama sorunlarından kaynaklanan gecikme sorunlarını bulmak için mükemmeldir. Örnek tabanlı profiller gibi diğer profiller, sistem izlerinin sağladığı zamanlama bilgilerini sağlamaz.

  • Yinelenen hesaplamaları bulma İzleme, belirli hesaplamaların tekrar edilip edilmediğini ortaya çıkarabilir. Bu durum, gereksiz işlemler yapıldığını gösterebilir.

  • Kilit çekişmesi sorunlarını teşhis edin. İş parçacığı durumları ve kaynakların ne zaman engellendiğini gösteren dilimler hakkındaki bilgilerle, kullanıcı yolculuklarında gecikmelere neden olan kilitleri (ör. synchronized blokları) belirleyebilirsiniz.

  • Uygulamanızdaki çoklu iş parçacığını anlayın. İzler, birden fazla iş parçacığının görünümünü sunar. Her iş parçacığının durumunu ve sistem ya da uygulamanız tarafından eklenen tüm iz dilimlerini gösterir. Bu çoklu iş parçacığı görünümü, hangi iş parçacıklarının etkin olduğunu, uyuduğunu veya ne çalıştırdığını ve nasıl etkileşimde bulunduğunu anlamanıza yardımcı olur.

  • Karmaşık performans analizleri yapın. Güçlü kullanıcı arayüzü ve çeşitli bilgi türlerini görüntüleme özelliği sayesinde sistem izleri; gecikme, bellek ve pil kullanımı gibi çok çeşitli performans sorunlarında hata ayıklamak için kullanışlıdır.

Sistem izlemeleri, PerfettoSQL kullanılarak sorgulamayı da destekler. Bu güçlü özellik sayesinde:

  • Belirli verileri ayıklama
  • İzleme verilerini özel metriklere dönüştürme
  • Sorgulardan hata ayıklama izleri oluşturarak Perfetto kullanıcı arayüzünde en çok önem verdiğiniz şeyleri görselleştirmeyi kolaylaştırın.
  • Doğrudan Perfetto kullanıcı arayüzünde karmaşık analizler yapın.

Yığın örnek profilleri

Yığın örneği
profil örneği
Şekil 2.: Yığın örnek profili örneği.

Yığın örnekleme profilleri, kod yürütme örneklerini kaydederek ve bir iş parçacığı CPU'da görevleri çalıştırırken çağrı yığını bilgilerini belirli bir oranda depolayarak çalışır. Bu, kodunuzun yürütme sırasında ne yaptığına dair bilgiler sağlar.

Aşağıdaki işlemleri yapmak için yığın örnekleri kullanmanızı öneririz:

  • Etkileşim noktalarını optimize edin. Yığın örnekleri, kodunuzun çok fazla CPU etkinliği içeren bölümlerini belirlemenize yardımcı olur. Bu da iş parçacığının genellikle "çalışıyor" durumda olduğu anlamına gelir.
  • Kod yürütmeyi anlama. Yığın örnekleri, kod tabanınızın genel davranışını anlamanıza yardımcı olabilir.
  • Çalışmaması gereken kodu belirleyin. Hiç çalışmaması gereken çağrı yığınları bulabilirsiniz. Bu durum, optimizasyon için acil fırsatlara işaret eder.

Yığın dökümleri

Yığın dökümü örneği
3.şekil: Yığın dökümü örneği.

Java yığın dökümleri, uygulamanızın Java yığın belleğinin anlık görüntüsünü gösterir. Bu anlık görüntü, döküm alındığı sırada tüm nesneleri ve bunların birbirlerine nasıl referans verdiğini içerir.

Aşağıdakileri yapmak için yığın dökümleri toplamanızı öneririz:

  • Yinelenen nesneleri ortaya çıkarın. Yığın dökümleri, yinelenen nesneleri izlemek için yararlı olan canlı nesnelerin sayısını gösterir. Ayrıca nesne referansları da sağlarlar. Bu sayede, nesnelerin oluşturulduğu kod konumunu belirleyebilirsiniz.
  • Bellek sızıntılarını bulma Yığın dökümleri, döküm alındığında artık kullanılmaması gereken belleği ortaya çıkararak olası bellek sızıntılarını gösterebilir.
  • Optimize edilebilecek nesneleri belirleyin. Çok fazla bellek kullanan nesneleri ve bunların sayılarını gösteren yığın dökümleri, verimsiz bellek kullanım kalıplarını belirlemeye yardımcı olur.

Yığın profilleri

Yığın profili örneği
Şekil 4.: Yığın profili örneği.

Yığın profilleri hem yerel hem de Java sürümlerinde sunulur ve bellek sorunlarını ayıklamak için mükemmeldir. Bunlar, çağrı yığını örneklerine benzer ancak CPU döngülerini ölçmek yerine bellek ayrıldığında örnekler alır.

Aşağıdakileri yapmak için yığın profillerini kullanmanızı öneririz:

  • Bellek kullanımını azaltın. Yığın profilleri, bellek ayırma işlemleri için kod konumları içeren örnekler sağlar. Bu sayede, çok sayıda geçici nesne oluşturan alanları belirleyebilirsiniz. Bu alanlar, uygulamanızda sık sık çöp toplama (GC) işlemlerine neden olabilir.
  • Bellek sızıntılarını ortaya çıkarın. Yığın profilleri, bellek sızıntılarını teşhis etmek ve düzeltmek için diğer bellek profilleriyle birlikte kullanılabilir. Beklenenden çok daha fazla bellek ayıran konumları belirlemenize yardımcı olur.

Profilleri birleştirme

Genellikle performansı tek bir profille analiz edersiniz. Ancak birden fazla profilin veya tek bir birleştirilmiş profilin toplanması genellikle daha eksiksiz bir resim sunabilir ve tek bir profilin tek başına teşhis edemeyeceği karmaşık sorunların teşhis edilmesine yardımcı olabilir.

Profilleri birleştirmenin faydalı olduğu şu senaryoları göz önünde bulundurun:

  • 1. senaryo: Enstrümanı eklenmemiş kodu inceleme. Bir sistem izi, daha önce enstrümanını yaptığınız işlemler için gecikme gösterebilir. Ancak bu süreler boyunca çalışan kodunuzun izlenmeyen kısımları hakkında daha fazla bilgiye ihtiyacınız olabilir. Araştırmak için yürütülen kodu anlamak üzere bir çağrı yığını profili oluşturun. Bu bilgiler, daha fazla izleme dilimi ekleyerek izlemenizi iyileştirmenize yardımcı olabilir.

  • 2. Senaryo: Bellek sızıntılarını ve atık toplamaları analiz etme. Bir sistem izinin, tahsisler nedeniyle Java yığın belleğinde sürekli artış gösterdiğini ve sık sık çöp toplama işlemlerini (GC) tetiklediğini düşünün. Ayrılan nesneleri anlamak için yığın profili veya yığın dökümü alın. Bu birleşik yaklaşım, bellek kullanımını azaltmanın yollarını belirlemenize yardımcı olur. Örneğin, önbelleğe alma kullanarak gereksiz veya optimize edilebilir ayırmaları azaltmak, çöp toplama işlemlerinin gerçekleşmesini önleyebilir.