Penggunaan memori bitmap

Bitmap sering kali menjadi objek yang paling banyak menggunakan memori dalam aplikasi. Operasi decoding dan penskalaan sering kali berada di jalur penting untuk rendering frame. Mengoptimalkan penggunaan memori bitmap memberikan peningkatan signifikan dalam responsivitas UI, masa pakai baterai, dan stabilitas keseluruhan dengan mengurangi jank, ANR, dan penghentian proses terkait OOM.

Mengidentifikasi penggunaan memori bitmap yang tinggi

Android vitals menyediakan metrik tentang jejak memori bitmap aplikasi dengan menggabungkan data dari perangkat Android. Metrik ini dihitung sebagai ringkasan data harian selama 28 hari secara default. Data ini membantu mengidentifikasi tren dan potensi regresi efisiensi memori di berbagai jenis dan versi perangkat.

Android vitals membagikan penggunaan memori bitmap aplikasi Anda yang dikelompokkan berdasarkan status proses berikut:

  • Latar depan: Proses aplikasi terlihat. P99 diperkirakan akan jauh lebih tinggi di latar depan dibandingkan di status proses lainnya, tetapi developer harus menyelidiki jika rasio P99/P50 signifikan (misalnya, lebih tinggi dari 3,5x), karena hal ini sering kali menunjukkan kebocoran memori bitmap. Anda dapat mengidentifikasinya dengan mencari perbedaan antara penggunaan umum (P50) dan penggunaan pencilan (P99); meskipun pembengkakan aset umum meningkatkan memori secara seragam di semua persentil, kebocoran memori akan bertambah seiring waktu, sehingga sangat memiringkan data ujung belakang (P99). Pastikan alokasi bitmap latar depan tidak tetap ada tanpa perlu setelah aplikasi bertransisi ke status lain.
  • Layanan yang terlihat oleh pengguna: Proses aplikasi berjalan dalam status terlihat. Hal ini mencakup layanan latar depan, tugas yang dipercepat, dan tugas transfer data yang dimulai oleh pengguna. Aplikasi tidak boleh mempertahankan alokasi bitmap latar depan yang berat saat bertransisi ke status ini. Karena layanan ini dirancang untuk tugas yang berjalan lama, mempertahankan aset besar akan menurunkan kualitas pengalaman pengguna secara keseluruhan dan memaksa Daemon Low Memory Killer (LMKD) untuk merebut kembali memori dengan menghentikan proses berprioritas lebih rendah.
  • Latar belakang: Aplikasi menjalankan layanan latar belakang, atau baru-baru ini dijalankan di latar belakang, tetapi belum di-cache. Karena status proses ini kurang penting daripada proses latar depan atau yang dapat dirasakan, aplikasi harus secara eksplisit melepaskan aset bitmap besar di sini untuk mengurangi tekanan memori.
  • Di-cache: Aplikasi berada dalam status di-cache. Status ini sangat sensitif terhadap tekanan memori sistem seperti LMK. Aplikasi harus secara proaktif mengurangi penggunaan memori bitmap dalam status ini untuk menghindari pengusiran oleh OS.

Penyebab penggunaan memori bitmap yang tinggi

Memori virtual yang tidak pernah digunakan juga dapat disertakan dalam penghitungan. Jika Anda melihat penggunaan memori bitmap yang sangat tinggi secara tidak terduga, pastikan Anda tidak mengalokasikan memori yang tidak digunakan.

Resource

Menganalisis bitmap di Android Studio

Pembuatan profil Android Studio untuk bitmap

Gunakan Memory Profiler untuk memeriksa alokasi memori secara real-time, merekam heap dump, dan menganalisis objek untuk mendeteksi kebocoran memori; selain itu, gunakan heap analyzer untuk mendeteksi kebocoran memori, mengidentifikasi alokasi bitmap duplikat, dan memvisualisasikan retensi objek.

Deteksi kebocoran otomatis dengan LeakCanary

Integrasikan library LeakCanary untuk mengotomatiskan deteksi kebocoran memori di aplikasi Anda. LeakCanary menyediakan analisis heap otomatis, mengidentifikasi objek yang seharusnya dikumpulkan sampah tetapi masih disimpan dalam memori, seperti bitmap yang dipertahankan oleh komponen yang dihancurkan.

Dokumentasi Performa Bitmap

Referensi ini memberikan panduan komprehensif tentang praktik terbaik untuk penanganan bitmap yang efisien di berbagai komponen Android.

Checklist developer untuk mengoptimalkan penggunaan memori bitmap

Untuk mengoptimalkan efisiensi memori bitmap, ikuti tiga prinsip inti: kurangi, gunakan ulang, dan daur ulang.

  • Kurangi: Minimalkan jejak memori awal saat memuat atau menampilkan bitmap.
  • Penggunaan kembali: Terapkan mekanisme penyimpanan ke cache untuk menghindari alokasi bitmap yang berlebihan.
  • Daur ulang: Melepaskan resource secara proaktif untuk memungkinkan realokasi memori untuk proses aktif.

Checklist developer berikut dapat membantu Anda mengoptimalkan penggunaan memori bitmap.

Prinsip Inti Area Deskripsi
Reduce Menghilangkan Bitmap Duplikat Analisis heap dump menggunakan Memory Profiler untuk mendeteksi alokasi bitmap yang berlebihan. Lihat panduan Mengelola Memori Bitmap.
Memanfaatkan Library Pemuatan Gambar Gunakan library seperti Glide dan Coil, untuk mengotomatiskan threading, caching, dan decoding yang efisien.
Menerapkan Penurunan/Pengurangan Sampel Dekode gambar agar sesuai dengan dimensi penampung UI target, bukan memuat aset resolusi penuh.
Gunakan RGB_565 untuk Gambar Buram Kurangi jejak memori sebesar 50% dengan beralih dari ARGB_8888 ke konfigurasi 16-bit untuk gambar tanpa transparansi.
Memprioritaskan VectorDrawable Gunakan vektor untuk ikon dan grafik dasar guna memastikan penskalaan yang tajam dengan overhead memori minimal.
Mengoptimalkan Penayangan Gambar Sisi Server Konfigurasi API backend untuk menayangkan gambar yang disesuaikan dengan kepadatan perangkat dan dimensi penampung UI.
Menghilangkan Margin Transparan Hindari mengalokasikan memori untuk piksel "tidak terlihat" dengan menggunakan InsetDrawable atau padding tata letak, bukan margin bawaan. Lihat Membangun aplikasi Android yang berperforma tinggi dalam penggunaan memori.
Gunakan kembali Mengonfigurasi Ukuran Cache Optimal Menyesuaikan batas cache memori dan cache disk berdasarkan RAM perangkat dan resolusi layar. Lihat Menyimpan Cache Bitmap.
Daur Ulang Menghapus Permanen Resource di Latar Belakang Terapkan TRIM_MEMORY_BACKGROUND untuk menghapus cache dan meningkatkan kelangsungan proses selama tekanan memori sistem.
Melepaskan Aset saat UI Disembunyikan Gunakan TRIM_MEMORY_UI_HIDDEN untuk melepaskan cache bitmap saat aplikasi tidak lagi terlihat oleh pengguna.
Memantau Kebocoran Memori Gunakan LeakCanary dan Memory Profiler untuk menemukan bitmap yang dipertahankan setelah LifecycleOwner-nya dihancurkan. Lihat Mengelola memori aplikasi.