Bitmap sering kali menjadi objek yang paling banyak menggunakan memori dalam aplikasi. Operasi decoding dan penskalaan sering kali berada di jalur kritis 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 mencakup persentil berbasis periode (misalnya, 28 hari) per paket dan proses. 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 diharapkan 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 mengidentifikasi hal ini dengan mencari perbedaan antara penggunaan umum (P50) dan penggunaan pencilan (P99); meskipun pembengkakan aset umum meningkatkan memori secara merata di semua persentil, kebocoran memori akan bertambah seiring waktu, sehingga sangat memiringkan data akhir (P99). Pastikan alokasi bitmap latar depan tidak tetap ada secara tidak perlu setelah aplikasi bertransisi ke status lain.
- Layanan yang dirasakan pengguna: Proses aplikasi berjalan dalam status dapat dirasakan. 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 keseluruhan pengalaman pengguna dan memaksa Low Memory Killer Daemon (LMKD) untuk merebut kembali memori dengan menghentikan proses berprioritas 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 Aktivitas atau Fragmen 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 ulang: 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 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 ImageView. | |
| 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 | Sesuaikan 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. |