这取决于您对希望获得的内存查询的定义。
通常,您想知道堆内存的状态,因为如果它使用过多的内存,您会得到 OOM 并使应用程序崩溃。
为此,您可以检查下一个值:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
“usedMemInMB”变量越接近“maxHeapSizeInMB”,availHeapSizeInMB 越接近零,越接近 OOM。 (由于内存碎片,您可能会在此达到零之前得到 OOM。)
这也是 DDMS 内存使用工具显示的内容。
另外,还有实际的 RAM 使用量,即整个系统使用了多少 - 请参阅 accepted answer 来计算。
更新:由于 Android O 使您的应用也使用本机 RAM(至少对于位图存储而言,这通常是使用大量内存的主要原因),而不仅仅是堆,因此发生了变化,并且您获得的 OOM 更少(因为堆不再包含位图,请检查here),但是如果您怀疑您有内存泄漏,您仍然应该注意内存使用。在 Android O 上,如果您的内存泄漏本应在旧版本上导致 OOM,那么它似乎只会崩溃而您无法捕捉到它。以下是检查内存使用情况的方法:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
但我认为最好使用 IDE 的分析器,它使用图表实时显示数据。
因此,Android O 上的好消息是,由于存储过多大位图的 OOM,导致崩溃更难发生,但坏消息是,我认为在运行时不可能捕获这种情况。
编辑:Debug.getNativeHeapSize() 似乎随着时间的推移而变化,因为它向您显示了您的应用程序的总最大内存。因此,这些函数仅用于分析器,以显示您的应用程序正在使用多少。
如果您想获得真实的总可用本机 RAM,请使用:
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%)")