Memahami dan memecahkan masalah memori Android

Memori adalah resource yang penting dan terbatas pada perangkat yang didukung Android. Sebagai developer platform Android atau OEM, memahami cara kerja memori di setiap level—mulai dari runtime Java hingga kernel Linux—sangat penting untuk membangun sistem yang berperforma tinggi dan stabil.

Panduan ini memberikan ringkasan komprehensif tentang arsitektur memori Android, alat yang tersedia untuk analisis, dan latihan praktis untuk membantu Anda mengidentifikasi dan menyelesaikan masalah terkait memori.

Tujuan

Setelah menyelesaikan panduan ini, Anda akan dapat:

  • Menjelaskan konsep dasar memori Android, termasuk model proses Zygote dan file yang dipetakan memori.
  • Membedakan antara Resident Set Size (RSS), Proportional Set Size (PSS), dan Unique Set Size (USS).
  • Gunakan alat command line standar seperti dumpsys meminfo dan showmap untuk menilai penggunaan memori dengan cepat.
  • Ambil dan analisis heap dump Java menggunakan AHAT untuk menemukan kebocoran dan alokasi yang berlebihan.
  • Gunakan Perfetto dan heapprofd untuk membuat profil memori Java dan native di seluruh sistem.
  • Pahami indikator tekanan memori di seluruh sistem seperti Pressure Stall Information (PSI) dan pantau aktivitas Low Memory Killer (LMK).
  • Amati aktivitas reklamasi tingkat kernel, termasuk penghapusan cache halaman dan swap ZRAM.

Struktur panduan

Panduan ini disusun dalam bagian-bagian berikut, yang dirancang untuk dibaca secara berurutan:

  1. Konsep dasar: Prinsip teknis inti memori Android.
  2. Alat penilaian cepat: Menggunakan meminfo, showmap, dan procstats untuk triase cepat.
  3. Menganalisis memori Java: Pembahasan mendalam tentang heap Java dengan AHAT.
  4. Bitmap dan memori: Memahami dampak gambar terhadap RAM dan menggunakan alat untuk membuat profilnya.
  5. Menganalisis memori native: Membuat profil memori C/C++ dengan Perfetto dan heapprofd.
  6. WebView dan memori: Memahami arsitektur multiproses dan jejak memori WebView.
  7. Kode aplikasi adalah memori: Memahami pengaruh pemuatan class dan bloatware dex terhadap RAM.
  8. Thread dan memori: Menganalisis biaya stack thread native.
  9. Lokalitas dan performa memori: Memahami pengaruh pola akses data terhadap performa CPU.
  10. Pengikatan layanan dan status proses: Memahami pengaruh dependensi lintas proses terhadap skor OOM.
  11. Pemecahan masalah di seluruh sistem: Memantau PSI, LMK, swap ZRAM, dan penghapusan cache halaman.
  12. Klaim kembali memori: pengeluaran dan swap: Memahami memcg, pengisian daya, dan klaim kembali proaktif dengan memory.reclaim.
  13. Interaksi kswapd dan lmkd: Memahami cara kerja kswapd dan lmkd bersama-sama saat berada di bawah tekanan.
  14. Mengembalikan halaman memori ke OS: Menggunakan madvise dan posix_fadvise untuk mengembalikan halaman heap dan halaman cache file yang tidak digunakan ke kernel.
  15. Menjaga pekerjaan latar belakang tetap aktif dengan proses yang ramping: Memindahkan layanan latar belakang dan worker ke proses khusus sehingga memori UI dan memori grafis tidak dipertahankan pada prioritas yang lebih tinggi.

Prasyarat dan lingkungan

Panduan ini menyajikan alur kerja referensi, data tolok ukur, dan studi kasus yang menunjukkan cara mendiagnosis dan menyelesaikan masalah memori Android.

  • Alat analisis: Teknik dalam panduan ini terutama menggunakan alat performa Android standar, termasuk Perfetto, dumpsys meminfo, showmap, dan AHAT.
  • Hak istimewa root: Beberapa alur kerja diagnostik tingkat sistem (seperti memeriksa tekanan memori kernel atau penghitung PMU hardware) memerlukan hak istimewa root yang ditingkatkan (adb root) pada build emulator atau perangkat userdebug.

Mulai dari Sini: Konsep dasar