Saya telah menggunakan / proc / meminfo dan mem-parsed command response. Namun hasilnya menunjukkan bahwa:
MemTotal: 94348 kB MemFree: 5784 kB
cara. itu menunjukkan hanya ada 5MB memori kosong. Apakah mungkin dengan ponsel android? Hanya ada 5-6 aplikasi yang diinstal di ponsel saya dan tidak ada tugas lain yang sedang berjalan. tetapi tetap saja perintah ini menunjukkan hanya ada sedikit memori bebas.
Adakah yang bisa menjelaskan ini? atau apakah ada cara lain untuk mendapatkan penggunaan memori di android?
android
memory-management
Badal
sumber
sumber
Debug.getNativeHeapFreeSize()
.Jawaban:
PERHATIAN: Jawaban ini mengukur penggunaan memori / ketersediaan DEVICE. Ini BUKAN yang tersedia untuk aplikasi Anda. Untuk mengukur apa yang sedang dilakukan APP Anda, dan DIPERBOLEHKAN untuk melakukannya, Gunakan jawaban pengembang android .
Dokumen Android - ActivityManager.MemoryInfo
parse / proc / meminfo. Anda dapat menemukan kode referensi di sini: Dapatkan Penggunaan Memori di Android
gunakan kode di bawah ini dan dapatkan RAM saat ini:
Penjelasan tentang angka 0x100000L
Cukup jelas bahwa angka tersebut digunakan untuk mengonversi dari byte ke mebibyte
PS: kita hanya perlu menghitung memori total sekali. jadi panggil poin 1 hanya sekali dalam kode Anda dan setelah itu, Anda dapat memanggil kode poin 2 berulang-ulang.
sumber
Itu tergantung pada definisi Anda tentang kueri memori yang ingin Anda dapatkan.
Biasanya, Anda ingin mengetahui status memori heap, karena jika memori menggunakan terlalu banyak, Anda mendapatkan OOM dan merusak aplikasi.
Untuk ini, Anda dapat memeriksa nilai berikutnya:
Semakin banyak variabel "usedMemInMB" mendekati "maxHeapSizeInMB", semakin mendekati
availHeapSizeInMB
nol, semakin dekat Anda mendapatkan OOM. (Karena fragmentasi memori, Anda mungkin mendapatkan OOM SEBELUM ini mencapai nol.)Itu juga yang ditunjukkan oleh alat DDMS untuk penggunaan memori.
Atau, ada penggunaan RAM yang sebenarnya, yaitu berapa banyak yang digunakan seluruh sistem - lihat jawaban yang diterima untuk menghitungnya.
Pembaruan: karena Android O membuat aplikasi Anda juga menggunakan RAM asli (setidaknya untuk penyimpanan Bitmaps, yang biasanya merupakan alasan utama penggunaan memori yang besar), dan bukan hanya heap, banyak hal telah berubah, dan Anda mendapatkan lebih sedikit OOM (karena heap tidak lagi mengandung bitmap, periksa di sini ), tetapi Anda harus tetap mengawasi penggunaan memori jika Anda curiga Anda mengalami kebocoran memori. Di Android O, jika Anda memiliki kebocoran memori yang seharusnya menyebabkan OOM pada versi yang lebih lama, tampaknya itu hanya akan macet tanpa Anda dapat menangkapnya. Berikut cara memeriksa penggunaan memori:
Tapi saya percaya mungkin yang terbaik adalah menggunakan profiler dari IDE, yang menampilkan data secara real time, menggunakan grafik.
Jadi, kabar baik di Android O adalah jauh lebih sulit untuk mendapatkan error karena OOM menyimpan terlalu banyak bitmap besar, tetapi berita buruknya adalah menurut saya tidak mungkin untuk menangkap kasus seperti itu selama runtime.
EDIT: tampaknya
Debug.getNativeHeapSize()
berubah seiring waktu, karena ini menunjukkan kepada Anda total memori maksimal untuk aplikasi Anda. Jadi fungsi tersebut hanya digunakan untuk profiler, untuk menunjukkan seberapa banyak aplikasi Anda digunakan.Jika Anda ingin mendapatkan total nyata dan RAM asli yang tersedia, gunakan ini:
sumber
Berikut ini cara menghitung penggunaan memori dari aplikasi yang sedang berjalan :
sumber
Runtime.freeMemory()
mengembalikan 0 dan hanyaRuntime.totalMemory()
mengembalikan memori yang dialokasikan saat ini.Cara lain (saat ini menunjukkan 25MB gratis di G1 saya):
sumber
Filosofi manajemen memori Linux adalah "Memori bebas adalah memori yang terbuang".
Saya berasumsi bahwa dua baris berikutnya akan menunjukkan berapa banyak memori yang ada di "Buffer" dan berapa banyak yang "Cache". Meskipun ada perbedaan di antara keduanya (tolong jangan tanya apa perbedaannya :) keduanya secara kasar menambah jumlah memori yang digunakan untuk menyimpan data file dan metadata.
Panduan yang jauh lebih berguna untuk membebaskan memori di sistem Linux adalah
free(1)
perintah; di desktop saya, ini melaporkan informasi seperti ini:+/- buffer / cache: line adalah garis ajaib, ia melaporkan bahwa saya benar-benar memiliki sekitar 589 MB memori proses yang diperlukan secara aktif, dan sekitar 5391 MB memori 'gratis', dalam arti bahwa 91 + 374 MB buffer / memori cache dapat dibuang jika memori dapat digunakan secara lebih menguntungkan di tempat lain.
(Mesin saya telah menyala sekitar tiga jam, hampir tidak melakukan apa pun kecuali stackoverflow, itulah sebabnya saya memiliki begitu banyak memori kosong.)
Jika Android tidak disertakan
free(1)
, Anda dapat menghitung sendiri dengan/proc/meminfo
file tersebut; Saya hanya sukafree(1)
format keluarannya. :)sumber
cat /proc/meminfo
. Ini jauh lebih detail, tapiMemFree
.Buffers
, danCached
mungkin baris yang paling penting.Saya merujuk beberapa tulisan.
referensi:
Metode getMemorySize () ini mengembalikan MemorySize yang memiliki ukuran memori total dan gratis.
Saya tidak percaya kode ini dengan sempurna.
Kode ini sedang diuji pada LG G3 cat.6 (v5.0.1)
Saya tahu bahwa Pattern.compile () mahal biayanya jadi Anda dapat memindahkan kodenya ke anggota kelas.
sumber
Saya melihat Pohon Sumber Android.
Di dalam com.android.server.am. ActivityManagerService.java (layanan internal yang diekspos oleh android.app. ActivityManager ).
Di dalam android.os. Process.java
Ini memanggil metode JNI dari android_util_Process.cpp
Kesimpulan
MemoryInfo.availMem = MemFree + Tersimpan dalam cache di / proc / meminfo.
Catatan
Total Memori ditambahkan di API level 16.
sumber
Anda juga dapat menggunakan alat DDMS yang merupakan bagian dari SDK Android itu sendiri. ini membantu dalam mendapatkan alokasi memori dari kode java dan kode c / c ++ asli juga.
sumber
sumber
Ini adalah kode yang aneh. Ini mengembalikan MaxMemory - (totalMemory - freeMemory). Jika freeMemory sama dengan 0, maka kode akan mengembalikan MaxMemory - totalMemory, jadi bisa lebih atau sama dengan 0. Mengapa freeMemory tidak digunakan?
sumber
Berikut cara lain untuk melihat penggunaan memori aplikasi Anda:
Output sampel:
Untuk penggunaan memori secara keseluruhan:
https://developer.android.com/studio/command-line/dumpsys#meminfo
sumber