Nó phụ thuộc vào định nghĩa của bạn về truy vấn bộ nhớ mà bạn muốn lấy.
Thông thường, bạn muốn biết trạng thái của bộ nhớ heap, vì nếu nó sử dụng quá nhiều bộ nhớ, bạn sẽ nhận được OOM và làm hỏng ứng dụng.
Đối với điều này, bạn có thể kiểm tra các giá trị tiếp theo:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
Biến "usedMemInMB" càng gần với "maxHeapSizeInMB", càng về gần availHeapSizeInMB
0, bạn càng gần OOM. (Do phân mảnh bộ nhớ, bạn có thể nhận được OOM TRƯỚC khi con số này đạt đến 0.)
Đó cũng là những gì mà công cụ DDMS sử dụng bộ nhớ cho thấy.
Ngoài ra, còn có mức sử dụng RAM thực, là mức sử dụng của toàn bộ hệ thống - hãy xem câu trả lời được chấp nhận để tính toán điều đó.
Cập nhật: vì Android O làm cho ứng dụng của bạn cũng sử dụng RAM gốc (ít nhất là cho bộ nhớ Bitmap, thường là lý do chính cho việc sử dụng bộ nhớ lớn), và không chỉ heap, mọi thứ đã thay đổi và bạn nhận được ít OOM hơn (vì heap không chứa bitmap nữa, hãy kiểm tra tại đây ), nhưng bạn vẫn nên theo dõi việc sử dụng bộ nhớ nếu bạn nghi ngờ mình bị rò rỉ bộ nhớ. Trên Android O, nếu bạn bị rò rỉ bộ nhớ mà lẽ ra phải gây ra OOM trên các phiên bản cũ hơn, thì có vẻ như nó sẽ gặp sự cố mà bạn không thể bắt được. Đây là cách kiểm tra việc sử dụng bộ nhớ:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Nhưng tôi tin rằng tốt nhất có thể sử dụng trình biên dịch của IDE, trình biên dịch này hiển thị dữ liệu trong thời gian thực, sử dụng biểu đồ.
Vì vậy, tin tốt trên Android O là khó gặp sự cố hơn nhiều do OOM lưu trữ quá nhiều bitmap lớn, nhưng tin xấu là tôi không nghĩ có thể gặp trường hợp như vậy trong thời gian chạy.
CHỈNH SỬA: dường như Debug.getNativeHeapSize()
thay đổi theo thời gian, vì nó hiển thị cho bạn tổng bộ nhớ tối đa cho ứng dụng của bạn. Vì vậy, các chức năng đó chỉ được sử dụng cho trình biên dịch, để hiển thị mức độ sử dụng ứng dụng của bạn.
Nếu bạn muốn nhận tổng số RAM thực và RAM gốc có sẵn, hãy sử dụng cái này:
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()
.