Saya cukup ingin tahu tentang pertanyaan ini mengenai manajemen memori sistem operasi Android, jadi saya berharap jawaban yang cukup terperinci tentang topik itu.
Apa yang ingin saya ketahui:
- Berapa jumlah maksimum memori (dalam megabita / sebagai persentase dari total RAM) yang dapat digunakan oleh aplikasi Android (yang bukan aplikasi sistem)?
- Apakah ada perbedaan antara versi Android ?
- Apakah ada perbedaan mengenai produsen perangkat?
Dan yang paling penting:
- Apa yang dianggap / apa itu tergantung pada ketika datang ke sistem menentukan berapa banyak RAM aplikasi dapat digunakan saat runtime (dengan asumsi bahwa maksimum memori per aplikasi bukan angka statis)?
Apa yang saya dengar sejauh ini (hingga 2013):
- Perangkat Android awal memiliki batas per aplikasi 16MB
- Nanti tutup ini meningkat menjadi 24MB atau 32MB
Apa yang membuat saya sangat penasaran:
Kedua batas ini sangat rendah.
Saya baru saja mengunduh Android Task Manager untuk memeriksa RAM perangkat saya. Apa yang saya perhatikan adalah bahwa ada aplikasi yang menggunakan sekitar 40-50 megabyte RAM, yang jelas lebih dari penggunaan RAM maksimum yang disebutkan katakanlah 32 MB. Jadi, bagaimana Android menentukan berapa banyak RAM yang bisa digunakan aplikasi? Bagaimana mungkin aplikasi melebihi batas itu?
Selain itu, saya perhatikan bahwa beberapa aplikasi tambang saya mogok (terbunuh oleh sistem?) Dengan OutOfMemoryException saat menggunakan sekitar 30-40 Megabita. Di sisi lain, saya memiliki aplikasi yang berjalan di ponsel saya menggunakan 100 MB dan lebih banyak setelah beberapa waktu (mungkin karena kebocoran memori) yang tidak crash atau terbunuh. Jadi itu jelas juga tergantung pada aplikasi itu sendiri ketika datang untuk menentukan berapa banyak RAM yang dapat dihemat. Bagaimana ini mungkin? (Saya melakukan tes dengan HTC One S dengan 768 MB RAM)
Penafian: Saya TIDAK berafiliasi dengan aplikasi Android Task Manager.
sumber
Ini adalah akhir tahun 2018 sehingga banyak hal telah berubah.
Pertama-tama: jalankan aplikasi Anda dan buka tab Android Profiler di Android Studio. Anda akan melihat berapa banyak memori yang dikonsumsi, Anda akan terkejut tetapi dapat mengalokasikan banyak RAM.
Juga di sini adalah artikel yang bagus dalam dokumen resmi dengan instruksi terperinci tentang cara menggunakan Memory Profiler yang dapat memberi Anda pandangan mendalam tentang manajemen memori Anda.
Tetapi dalam sebagian besar kasus, Profiler Android reguler Anda sudah cukup untuk Anda.
Biasanya, aplikasi dimulai dengan alokasi RAM 50 MB tetapi langsung melonjak hingga 90 MB ketika Anda mulai memuat beberapa foto dalam memori. Saat Anda membuka Aktivitas dengan ViewPager dengan foto yang dimuat sebelumnya (masing-masing 3,5Mb), Anda bisa mendapatkan 190Mb dengan mudah dalam hitungan detik.
Tetapi ini tidak berarti Anda memiliki masalah dengan manajemen memori.
Saran terbaik yang bisa saya berikan adalah mengikuti pedoman dan praktik terbaik, gunakan perpustakaan teratas untuk memuat gambar (Glide, Picasso) dan Anda akan baik-baik saja.
Tetapi jika Anda perlu menyesuaikan sesuatu dan Anda benar-benar perlu tahu berapa banyak memori yang dapat Anda alokasikan secara manual, Anda bisa mendapatkan total memori bebas dan menghitung bagian yang telah ditentukan sebelumnya (dalam%) dari itu. Dalam kasus saya, saya perlu men-cache foto yang didekripsi dalam memori sehingga saya tidak perlu mendekripsi mereka setiap kali pengguna menelusuri daftar.
Untuk tujuan ini, Anda dapat menggunakan kelas LruCache siap pakai . Ini adalah kelas cache yang secara otomatis melacak berapa banyak memori yang dialokasikan objek Anda (atau jumlah instance) dan menghapus yang tertua untuk menjaga yang terbaru berdasarkan riwayat penggunaannya. Berikut adalah tutorial yang bagus tentang cara menggunakannya.
Dalam kasus saya, saya membuat 2 contoh cache: untuk jempol dan lampiran. Jadikan mereka statis dengan akses tunggal sehingga tersedia secara global di seluruh aplikasi.
kelas cache:
Ini adalah bagaimana saya menghitung RAM gratis yang tersedia dan berapa banyak yang bisa saya gigit darinya:
Dan ini adalah bagaimana saya menggunakannya dalam Adaptor untuk mendapatkan gambar dalam tembolok:
dan bagaimana saya mengaturnya ke dalam cache di latar belakang (AsyncTask biasa):
Aplikasi saya menargetkan API 19+ sehingga perangkat tidak lama dan bagian RAM yang tersedia ini cukup baik untuk cache dalam kasus saya (1% dan 3%).
Fakta menyenangkan: Android tidak memiliki API atau peretasan lain untuk mendapatkan jumlah memori yang dialokasikan untuk aplikasi Anda, itu dihitung dengan cepat berdasarkan berbagai faktor.
PS Saya menggunakan bidang kelas statis untuk menyimpan cache tetapi sesuai dengan pedoman Android terbaru direkomendasikan untuk menggunakan komponen arsitektur ViewModel untuk tujuan itu.
sumber
Batas memori per aplikasi ada di sini tergantung pada ukuran layar dan versi Android: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing
Sumber: Unduhan Kompatibilitas Android http://source.android.com/compatibility/downloads.html ; Dokumen Definisi Kompatibilitas (CDD), Bagian Kompatibilitas Mesin Virtual atau Kompatibilitas Runtime
sumber