Low memory killer

Platform Android berjalan pada premis bahwa memori bebas adalah memori yang sia-sia. Android mencoba menggunakan semua memori yang tersedia sepanjang waktu. Misalnya, sistem menyimpan aplikasi yang ditutup di memori sehingga pengguna dapat membukanya kembali dengan cepat. Karena alasan ini, perangkat Android sering berjalan dengan memori bebas yang sangat sedikit (lihat Alokasi memori Android di sini).

Proses daemon low memory killer (LMK) Android memantau status memori sistem Android yang sedang berjalan dan bereaksi terhadap tekanan memori tinggi dengan menghentikan proses yang paling tidak penting untuk menjaga performa sistem pada tingkat yang dapat diterima.

Untuk menentukan proses yang akan dihentikan, daemon LMK menggunakan skor kehabisan memori yang disebut oom_adj_score untuk memprioritaskan proses yang berjalan. Proses dengan skor tinggi akan dihentikan terlebih dahulu. Aplikasi latar belakang dihentikan terlebih dahulu; proses sistem, terakhir. Tabel berikut mencantumkan kategori skor LMK dari tinggi ke rendah. Item dalam kategori skor tertinggi, di baris pertama, akan dihentikan terlebih dahulu:

Proses Android yang diberi peringkat dari skor tertinggi hingga terendah: Aplikasi latar belakang, aplikasi sebelumnya, aplikasi layar utama, layanan, aplikasi yang dapat dirasakan, aplikasi latar depan, persisten, sistem, dan native.
Gambar 1. Proses Android, dengan skor tertinggi di bagian atas dan skor rendah di bagian bawah.

Alat pembuatan profil memori

Alat berikut dapat membantu Anda menemukan dan mendiagnosis masalah memori dengan cara berikut:

  • Lihat bagaimana aplikasi Anda mengalokasikan memori dari waktu ke waktu. Anda dapat menemukan grafik real-time tentang banyaknya memori yang digunakan aplikasi Anda, jumlah objek Java yang dialokasikan, dan kapan pembersihan sampah memori dilakukan.
  • Mulai peristiwa pembersihan sampah memori dan ambil cuplikan dari heap Java selagi aplikasi berjalan.
  • Rekam alokasi memori aplikasi Anda, periksa semua objek yang dialokasikan, dan lihat pelacakan tumpukan untuk setiap alokasi.

Jika game Anda berjalan di mesin native, gunakan HWAddress Sanitizer untuk men-debug alokasi memori native.

Memory Profiler Android Studio

Android Studio menyediakan Memory Profiler sebagai komponen Android Profiler yang membantu Anda mengidentifikasi kebocoran memori dan churn memori yang dapat menyebabkan aplikasi tersendat, berhenti merespons, dan bahkan tidak berfungsi. Profiler menampilkan grafik real-time penggunaan memori aplikasi Anda dan memungkinkan Anda merekam heap dump, memaksa pembersihan sampah memori, dan melacak alokasi memori.

Gambar 2. Menampilkan referensi JNI global di Memory Profiler Android Studio.

Alat pembuatan profil memori Unity

Jika Anda menggunakan Unity Engine untuk membangun aplikasi, Anda dapat mengikuti panduan pembuatan profil memori Unity. Unity menawarkan dua alat untuk menganalisis penggunaan memori di aplikasi Anda di Unity.

Yang pertama adalah modul Memory Profiler, yang merupakan profiler bawaan yang memberi Anda informasi dasar tentang tempat aplikasi Anda menggunakan memori.

Modul memori menampilkan alokasi memori seperti memori tekstur dan memori mesh.
Gambar 3. Jendela Unity Profiler dengan modul Memory yang dipilih.

Alat kedua adalah paket Memory Profiler, yang merupakan paket Unity yang dapat Anda tambahkan ke project. Paket ini menambahkan jendela Memory Profiler tambahan ke Unity Editor. Memory Profiler memungkinkan Anda menganalisis penggunaan memori dalam aplikasi secara lebih mendetail. Anda dapat menyimpan dan membandingkan snapshot untuk menemukan kebocoran memori atau melihat tata letak memori untuk menemukan masalah fragmentasi memori.

Gambar 4. Menganalisis snapshot memori menggunakan jendela Memory Profiler.

Insight Memori Unreal

Aplikasi yang dibuat oleh Unreal Engine dapat menggunakan Unreal Memory Insights untuk melihat informasi mendetail tentang alokasi dan dealokasi memori, termasuk tag Low Level Memory (LLM) dan callstack yang terkait dengan blok memori.

Sistem kueri Insight Memori dapat menemukan alokasi aktif kapan saja, mengidentifikasi perubahan penggunaan memori, menemukan kebocoran memori, dan membedakan alokasi jangka pendek dari jangka panjang.

Mulai dari UE 5.4, Memory Insights mendukung pelacakan memori dengan callstack untuk project Android.

Pelacak Insight Memori yang menampilkan grafik memori utama, jumlah alokasi live, dan jumlah peristiwa alokasi/pelepasan.
Gambar 5. Pelacak Insight Memori Unreal.

Insight memori rendah

Android menyediakan callback dan API yang memungkinkan Anda mengurangi persyaratan memori game dan menentukan alasan penghentian game sebelumnya.

Callback

Jangan mendaftar untuk callback trim yang tidak digunakan lagi. Android tidak memiliki API untuk mendeteksi peristiwa tekanan memori native saat sistem mengalami batas memori. Callback pemangkasan tidak membantu mencegah penghentian proses karena memori rendah, jadi Android menghentikan penggunaan semuanya kecuali TRIM_MEMORY_UI_HIDDEN dan TRIM_MEMORY_BACKGROUND.

Penghentian game

Android mencoba menggunakan semua memori yang tersedia untuk meng-cache aplikasi dan game guna memastikan aplikasi dan game tersebut dimuat dengan cepat (meningkatkan pengalaman pengguna), tetapi saat memori menjadi terbatas, sistem akan menghentikan aplikasi dan game yang paling banyak menggunakan memori untuk mengosongkan memori bagi pengoperasian perangkat yang normal.

Informasi, insight, dan praktik terbaik untuk membantu Anda mencapai penggunaan memori game yang lebih baik mencakup hal berikut:

  • Gunakan ApplicationExitInfo: API ini menampilkan alasan mengapa jalannya game sebelumnya dihentikan oleh sistem Android. Gunakan ApplicationExitInfountuk memeriksa memori rendah sebagai alasan kematian proses sebelumnya. Periksa apakah game dihentikan karena memori rendah sehingga game dapat dioptimalkan untuk menggunakan lebih sedikit memori di perangkat tersebut.
  • Lihat total RAM fisik: Untuk mencegah game dihentikan saat berada di latar depan dan agar sesuai dengan kemampuan perangkat, lihat total RAM fisik per perangkat untuk mendapatkan perincian yang akurat guna menyesuaikan penggunaan memori game berdasarkan hal tersebut. Jika tujuannya adalah mencegah aplikasi dihentikan tak lama setelah dipindahkan ke latar belakang (untuk memungkinkan pemain melakukan multitasking), gunakan callback trim (khususnya TRIM_MEMORY_UI_HIDDEN) untuk mengurangi penggunaan memori game Anda.

Referensi lainnya