Low memory killer

Daemon low memory killer (LMK) Android memantau status memori sistem Android yang sedang berjalan dan bereaksi terhadap tekanan memori yang tinggi dengan menghentikan proses yang paling tidak penting. Android vitals melacak dan melaporkan penghentian LMK yang dirasakan pengguna di Konsol Google Play untuk membantu Anda mengidentifikasi masalah tekanan memori yang memengaruhi pengguna.

Metrik LMK di Android vitals

Android vitals dapat membantu Anda memantau dan meningkatkan rasio LMK aplikasi. Android vitals hanya mengukur satu rasio LMK: Rasio LMK yang dirasakan pengguna.

Metrik ini mencerminkan persentase pengguna aktif harian yang mengalami setidaknya satu LMK yang dirasakan pengguna. LMK yang dirasakan pengguna adalah LMK yang kemungkinan telah diketahui oleh pengguna. Misalnya, hal ini mencakup LMK yang terjadi saat aplikasi Anda menampilkan aktivitas atau berjalan sebagai layanan latar depan. Penghentian ini mengakibatkan penghentian proses yang langsung dan tidak halus. Bagi pengguna akhir, aplikasi akan terlihat seperti error, sering kali mengabaikan mekanisme penyimpanan status siklus proses standar dan menyebabkan hilangnya progres pengguna.

Android vitals berfokus pada penghentian proses ini karena berfungsi sebagai proxy fidelitas tinggi untuk masalah kesalahan pengelolaan memori. Tingkat LMK di atas 1% menunjukkan kebutuhan mendesak untuk segera mengambil tindakan. Namun, rasio LMK yang lebih rendah tidak selalu berarti penggunaan memori aplikasi dalam kondisi baik. Rasio yang lebih rendah tersebut mungkin berarti daemon LMK sering menghentikan proses saat berada di latar belakang, sehingga menurunkan performa "warm start" dan kelancaran multitasking.

Anda dapat menemukan metrik ini di bagian Stabilitas di Android vitals:

Gambar 1. Akses Rasio LMK yang dirasakan pengguna di Android vitals.

Seperti metrik vital inti serupa, seperti ANR dan error, Anda dapat memfilter metrik, membandingkan metrik dengan pembanding, atau memantau perubahan metrik untuk jangka waktu yang lama (hingga 3 tahun). Data tersedia untuk aplikasi yang ada mulai 28 Jan 2025.

Gambar 2. Ringkasan rasio LMK di Android Vitals.

Cara kerja daemon 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 di antara proses).

Untuk menentukan proses yang akan dihentikan saat memori bebas hampir habis, daemon low memory killer (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, paling akhir. Tabel berikut mencantumkan kategori skor LMK dari tinggi ke rendah. Item dalam kategori skor tertinggi, di baris pertama, akan dihentikan terlebih dahulu:

Proses Android diberi peringkat dari skor tertinggi hingga terendah: Aplikasi latar belakang, aplikasi sebelumnya, aplikasi Home, layanan, aplikasi yang terlihat, aplikasi latar depan, persisten, sistem, dan native.
Gambar 3. 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 melalui cara berikut:

  • Lihat bagaimana aplikasi Anda mengalokasikan memori dari waktu ke waktu. Anda dapat menemukan grafik real-time yang menunjukkan 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 stack trace 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 bekerja. Profiler menampilkan grafik real-time tentang penggunaan memori aplikasi dan memungkinkan Anda merekam heap dump, memaksa pembersihan sampah memori, dan melacak alokasi memori.

Memory Profiler Android Studio menampilkan referensi JNI global dalam heap.
Gambar 4. Melihat referensi JNI global di Memory Profiler Android Studio.

Alat pembuatan profil memori Unity

Jika menggunakan Unity Engine untuk mem-build aplikasi, Anda dapat mengikuti panduan pembuatan profil memori Unity. Unity menawarkan dua alat untuk menganalisis penggunaan memori dalam 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 5. 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 di aplikasi Anda secara lebih mendetail. Anda dapat menyimpan dan membandingkan snapshot untuk menemukan kebocoran memori atau melihat tata letak memori untuk menemukan masalah fragmentasi memori.

Jendela Unity Memory Profiler yang menampilkan perincian snapshot memori.
Gambar 6. Menganalisis snapshot memori menggunakan jendela Memory Profiler.

Untuk alur kerja Unity khusus Android, lihat Memeriksa penggunaan memori dengan alat Unity, Mengoptimalkan penggunaan memori di Unity, dan Men-debug LMK untuk game Unity.

Unreal Memory Insights

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 stack panggilan yang terkait dengan blok memori.

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

Mulai UE 5.4, Memory Insights mendukung pelacakan memori dengan stack panggilan untuk project Android.

Pelacak Insight Memori yang menampilkan grafik memori utama, jumlah alokasi aktif, dan jumlah peristiwa alokasi/pembebasan.
Gambar 7. Pelacak Memory Insights Unreal.

Untuk alur kerja Unreal khusus Android, lihat Memeriksa penggunaan memori dengan Unreal dan Mengoptimalkan penggunaan memori di Unreal.

Insight memori rendah

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

Callback

Jangan mendaftar untuk callback trim yang tidak digunakan lagi. Android tidak menyediakan API untuk mendeteksi peristiwa tekanan memori native sebelum sistem mengklaim kembali memori, dan callback pemangkasan memori yang berjalan secara mendetail (TRIM_MEMORY_RUNNING_*) belum efektif dalam mencegah penghentian akibat memori rendah. Akibatnya, Android menghentikan penggunaan semua level pemangkasan selain TRIM_MEMORY_UI_HIDDEN dan TRIM_MEMORY_BACKGROUND. Gunakan callback yang tersisa ini—atau yang setara dengan siklus proses mesin seperti OnApplicationPause Unity dan ApplicationWillEnterBackgroundDelegate Unreal—untuk merilis UI dan resource tambahan saat game Anda berpindah ke latar belakang. Untuk mengetahui detail implementasi, lihat Mengurangi memori dalam game.

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 agar perangkat dapat beroperasi secara 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 game yang dijalankan sebelumnya dihentikan oleh sistem Android. Gunakan ApplicationExitInfo untuk memeriksa memori rendah (REASON_LOW_MEMORY) atau penghentian pembatas memori (REASON_MEMORY_LIMITER) sebagai alasan penghentian proses sebelumnya (lihat ApplicationExitInfo untuk game). Periksa apakah game dihentikan karena tekanan memori 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 untuk menyesuaikan kemampuan perangkat, lihat total RAM fisik per perangkat untuk perincian yang lebih mendetail guna menyesuaikan penggunaan memori game berdasarkan hal tersebut. Jika tujuannya adalah untuk mencegah aplikasi dihentikan segera setelah dipindahkan ke latar belakang (agar pemain dapat melakukan multitasking), gunakan callback trim (khususnya TRIM_MEMORY_UI_HIDDEN) untuk mengurangi penggunaan memori game Anda.

Referensi lainnya