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:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
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:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
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:
val memoryInfo = ActivityManager.MemoryInfo()
(getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).getMemoryInfo(memoryInfo)
val nativeHeapSize = memoryInfo.totalMem
val nativeHeapFreeSize = memoryInfo.availMem
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Log.d("AppLog", "total:${Formatter.formatFileSize(this, nativeHeapSize)} " +
"free:${Formatter.formatFileSize(this, nativeHeapFreeSize)} " +
"used:${Formatter.formatFileSize(this, usedMemInBytes)} ($usedMemInPercentage%)")
Debug.getNativeHeapFreeSize()
.