Java/Kotlin tahsislerini kaydet

Java/Kotlin ayırmalarını kaydetmek, performans sorunlarına neden olabilecek istenmeyen bellek kalıplarını belirlemenize yardımcı olur. Profiler, nesne ayırmalarıyla ilgili olarak size aşağıdakileri gösterebilir:

  • Hangi tür nesnelerin ayrıldığı ve ne kadar alan kullandıkları.
  • Hangi iş parçacığında olduğu da dahil olmak üzere her ayırmanın yığın izi.
  • Nesnelerin serbest bırakıldığı zaman.

Kodunuzun tam olarak nerede kısa sürede çok fazla nesne ayırdığını veya sızdırılan nesneler ayırdığını belirlemek için normal ve aşırı kullanıcı etkileşimi sırasında bellek ayırmalarını kaydetmeniz gerekir. Uygulama belleğinizin profilini neden oluşturmanız gerektiği hakkında daha fazla bilgi edinin.

Java/Kotlin ayırmaları nasıl kaydedilir?

Java/Kotlin ayırmalarını kaydetmek için profil oluşturucunun Ana Sayfa sekmesinden Bellek Tüketimini İzle (Java/Kotlin Ayırmaları) görevini seçin. Java/Kotlin ayırmalarını kaydetmek için hata ayıklanabilir bir uygulamaya ihtiyacınız olduğunu unutmayın (Profiler: run 'app' as debuggable (complete data) seçeneğini kullanın).

Android Studio, varsayılan olarak bellekteki tüm nesne ayırmalarını yakalar. Çok sayıda nesne ayıran bir uygulamanız varsa profilleme sırasında uygulamanızda gözle görülür yavaşlamalar olabilir. Profillendirme sırasında performansı artırmak için Allocation Tracking (Ayırma İzleme) açılır menüsüne gidin ve Full (Tam) yerine Sampled'ı (Örneklenmiş) seçin. Profiler, örnekleme yaparken düzenli aralıklarla bellekteki nesne ayırmalarını toplar.

Kayıt sırasında çöp toplama etkinliğini zorlamak için çöp simgesini tıklayın.

Java/Kotlin ayırmalarına genel bakış

Kaydı durdurduktan sonra aşağıdakileri görürsünüz:

  • Etkinlik zaman çizelgesinde etkinlik durumları, kullanıcı girişi etkinlikleri ve ekran döndürme etkinlikleri gösterilir.
  • Bellek kullanımının zaman çizelgesinde aşağıdaki bilgiler gösterilir. Belirli bir zaman aralığına göre filtrelemek için zaman çizelgesinin bir bölümünü seçin.
    • Soldaki y ekseni ve üstteki renk anahtarı ile gösterildiği gibi, her bellek kategorisinin kullandığı bellek miktarını gösteren yığılmış grafik.
    • Kesikli çizgi, sağdaki y ekseninde belirtildiği gibi ayrılan nesnelerin sayısını gösterir.
    • Her çöp toplama etkinliği için bir simge.
  • Tablo sekmesinde sınıfların listesi gösterilir. Toplam Sayı, seçilen zaman aralığının sonundaki tahsis sayısıdır (Tahsisler eksi Tahsis Kaldırmalar). Bu nedenle, en yüksek Toplam Sayı değerlerine sahip sınıflarda önce hata ayıklama yapmak mantıklı olabilir. Seçilen zaman aralığındaki en yüksek tahsisleri temel alan sınıflarda sorun giderme ile daha çok ilgileniyorsanız Tahsisler'e göre önceliklendirin. Benzer şekilde, Kalan Boyut, Ayrılan Boyut'tan Ayrılmayan Boyut çıkarılarak elde edilen bayt cinsinden değerdir.
  • Tablo listesinde bir sınıfı tıkladığınızda Örnek bölmesi açılır. Bu bölmede, ayrıldıkları ve serbest bırakıldıkları zaman ile sığ boyutları da dahil olmak üzere ilişkili nesnelerin listesi gösterilir.
  • Görselleştirme sekmesinde, seçilen zaman aralığı boyunca çağrı yığınındaki tüm nesnelerin toplu görünümü gösterilir. Temel olarak, gösterilen örneklerle birlikte çağrı yığınının toplam ne kadar bellek kullandığını gösterir. İlk satırda ileti dizisinin adı gösterilir. Varsayılan olarak, nesneler ayırma boyutuna göre soldan sağa doğru sıralanır. Sıralamayı değiştirmek için açılır listeyi kullanın.

  • Belirli yığınları filtrelemek için yığın açılır listesini kullanın. Yığın dökümü yakaladığınızda kullanılabilen filtrelere ek olarak, Java Native Interface (JNI) referanslarının ayrıldığı ve serbest bırakıldığı yeri gösteren yığın olan JNI yığınındaki sınıfları da filtreleyebilirsiniz.

  • Paylaştırmaların nasıl düzenleneceğini seçmek için düzenleme açılır menüsünü kullanın. Yığın dökümü yakaladığınızda kullanılabilen düzenlemelere ek olarak, çağrı yığınına göre de düzenleme yapabilirsiniz.

Bellek nasıl sayılır?

En üstte gördüğünüz sayılar, Android sistemine göre uygulamanızın ayırdığı tüm özel bellek sayfalarına dayanır. Bu sayıya, sistemle veya diğer uygulamalarla paylaşılan sayfalar dahil değildir. Bellek sayımındaki kategoriler şunlardır:

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

    Uygulamanızda C++ kullanmıyor olsanız bile, Android çerçevesi sizin adınıza çeşitli görevleri (ör. resim öğelerini ve diğer grafikleri işleme) yerine getirmek için yerel bellek kullandığından burada kullanılan yerel bellek görebilirsiniz. Yazdığınız kod Java veya Kotlin ile yazılmış olsa bile bu durum geçerlidir.

  • Grafikler: GL yüzeyleri, GL dokuları ve daha fazlası dahil olmak üzere pikselleri ekranda göstermek için grafik arabellek sıraları için kullanılan bellek. Bu belleğin, ayrılmış 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 kaç iş parçacığı çalıştırdığıyla ilgilidir.

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

  • Diğer: Sistem tarafından nasıl sınıflandırılacağı bilinmeyen, uygulamanızın kullandığı bellek.

  • Ayrılan: Uygulamanız tarafından ayrılan Java/Kotlin nesnelerinin sayısı. Bu sayıya C veya C++'da ayrılan nesneler dahil değildir.

Ayırma kaydını inceleme

Ayrım kaydını incelemek için aşağıdaki adımları uygulayın:

  1. Tablo sekmesindeki sınıf listesine göz atarak (neye göre optimizasyon yaptığınıza bağlı olarak) alışılmadık derecede büyük Ayırma veya Toplam Sayı değerlerine sahip olan ve sızdırılmış olabilecek nesneleri bulun.
  2. Örnek Görünümü bölmesinde bir örneği tıklayın. Bu örneğe neyin uygulanacağına bağlı olarak Alanlar veya Allocation Call Stack sekmesi açılır. Örneklerin gerçekten gerekli olup olmadığını veya gereksiz kopyalar olup olmadığını belirlemek için Alanlar ya da Allocation Call Stack (Tahsis Çağrı Yığını) sekmelerindeki bilgileri kullanın.

İlgili kaynak koduna gitmek için herhangi bir liste girişini sağ tıklayın.

Global JNI referanslarını görüntüleme

Java Native Interface (JNI), Java kodu ile yerel kodun birbirini çağırmasına olanak tanıyan bir çerçevedir. JNI referansları yerel kod tarafından manuel olarak yönetildiğinden aşağıdakiler de dahil olmak üzere sorunlar oluşabilir:

  • Yerel kod tarafından kullanılan Java nesneleri çok uzun süre canlı tutuluyor.
  • Bir JNI referansı önce açıkça silinmeden atılırsa Java yığınındaki bazı nesnelere ulaşılamayabilir.
  • Genel JNI referans sınırı aşıldı.

Bu tür sorunları gidermek için profilde JNI yığınını görüntüle'yi seçerek tüm genel JNI referanslarına göz atın ve bunları Java türlerine ve yerel çağrı yığınlarına göre filtreleyin. İlgili ayırma çağrı yığınını görmek için Alanlar sekmesindeki bir örnek alanını sağ tıklayın ve Örneğe git'i seçin.

Allocation Call Stack (Tahsis Çağrı Yığını) sekmesi, kodunuzda JNI referanslarının nerede tahsis edildiğini ve serbest bırakıldığını gösterir.

JNI hakkında daha fazla bilgi için JNI ipuçları başlıklı makaleyi inceleyin.