Android belleğini anlama ve sorunlarını giderme

Bellek, Android destekli cihazlarda kritik ve sınırlı bir kaynaktır. Android platformu geliştiricisi veya OEM olarak, Java çalışma zamanından Linux çekirdeğine kadar her düzeyde belleğin nasıl çalıştığını anlamak, performanslı ve kararlı bir sistem oluşturmak için çok önemlidir.

Bu kılavuzda, Android bellek mimarisine, analiz için kullanılabilecek araçlara ve bellekle ilgili sorunları tespit edip çözmenize yardımcı olacak pratik alıştırmalara kapsamlı bir genel bakış sunulmaktadır.

Hedefler

Bu kılavuzu tamamladıktan sonra şunları yapabileceksiniz:

  • Zygote işlem modeli ve bellekle eşlenen dosyalar dahil olmak üzere Android belleğinin temel kavramlarını açıklama
  • Yerleşik Küme Boyutu (RSS), Orantılı Küme Boyutu (PSS) ve Benzersiz Küme Boyutu (USS) arasındaki farkları açıklama
  • Bellek kullanımını hızlıca değerlendirmek için dumpsys meminfo ve showmap gibi standart komut satırı araçlarını kullanın.
  • Sızıntıları ve aşırı ayırmaları bulmak için AHAT'ı kullanarak Java yığın dökümlerini yakalayıp analiz edin.
  • Sistemin tamamında hem Java hem de yerel belleğin profilini çıkarmak için Perfetto ve heapprofd'yu kullanın.
  • Pressure Stall Information (PSI) gibi sistem genelindeki bellek baskısı göstergelerini anlayın ve Low Memory Killer (LMK) etkinliğini izleyin.
  • ZRAM takası ve sayfa önbelleği çıkarma dahil olmak üzere çekirdek düzeyinde geri alma etkinliğini gözlemleyin.

Kılavuzun yapısı

Bu kılavuz, sırayla okunacak şekilde tasarlanmış aşağıdaki bölümlere ayrılmıştır:

  1. Temel kavramlar: Android belleğinin temel teknik ilkeleri.
  2. Hızlı değerlendirme araçları: Hızlı önceliklendirme için meminfo, showmap ve procstats'yı kullanma.
  3. Java belleğini analiz etme: AHAT ile Java yığınını ayrıntılı inceleme
  4. Bit eşlemler ve bellek: Resimlerin RAM'i nasıl etkilediğini anlama ve bunları profillemek için araçları kullanma.
  5. Yerel belleği analiz etme: Perfetto ve heapprofd ile C/C++ belleğinin profilini çıkarma.
  6. Web Görünümü ve bellek: Web Görünümlerinin çoklu işlem mimarisini ve bellekte kapladığı yeri anlama.
  7. Uygulama kodu bellektir: Sınıf yükleme ve dex şişmesinin RAM'i nasıl etkilediğini anlama.
  8. İş parçacıkları ve bellek: Yerel iş parçacığı yığınlarının maliyetini analiz etme.
  9. Bellek yerelliği ve performans: Veri erişim modellerinin CPU performansını nasıl etkilediğini anlama.
  10. Hizmet bağlamaları ve işlem durumları: İşlemler arası bağımlılıkların OOM puanlarını nasıl etkilediğini anlama.
  11. Sistem genelinde sorun giderme: PSI, LMK, ZRAM takası ve sayfa önbelleği tahliyesini izleme.
  12. Bellek geri kazanımı: çıkarma ve takas: memory.reclaim ile memcg, şarj ve proaktif geri kazanımı anlama.
  13. kswapd ve lmkd etkileşimi: kswapd ve lmkd'nin baskı altında nasıl birlikte çalıştığını anlama.
  14. Bellek sayfalarını işletim sistemine döndürme: Kullanılmayan yığın sayfalarını ve dosya önbelleği sayfalarını çekirdeğe döndürmek için madvise ve posix_fadvise kullanma.
  15. Arka plan çalışmalarını yalın bir işlemle canlı tutma: Arka plan hizmetlerini ve çalışanlarını özel bir işleme taşıyarak kullanıcı arayüzü ve ekran kartı belleğinin yüksek öncelikli tutulmamasını sağlar.

Ön koşullar ve ortam

Bu kılavuzda, Android bellek sorunlarının nasıl teşhis edilip çözüleceğini gösteren referans iş akışları, karşılaştırma verileri ve örnek olaylar sunulmaktadır.

  • Analiz araçları: Bu kılavuzdaki tekniklerde öncelikle Perfetto, dumpsys meminfo, showmap ve AHAT gibi standart Android performans araçları kullanılır.
  • Kök ayrıcalıkları: Bazı sistem düzeyindeki teşhis iş akışları (ör. çekirdek bellek baskısını veya donanım PMU sayaçlarını inceleme), kullanıcı hata ayıklama cihazında veya emülatör derlemesinde yükseltilmiş kök ayrıcalıkları (adb root) gerektirir.

Buradan başlayın: Temel kavramlar