我有一个应用程序正在执行一些内存密集型任务。我试图弄清楚总可用内存是多少以及可用的空闲内存是多少。我这样做是通过使用Runtime.getRuntime().freeMemory()
和Runtime.getRuntime().totalMemory()
我很好奇我得到的结果是设备上的可用内存总量和总内存量,还是应用程序在其上运行的 Dalvik VM 实例可用的内存总量?我会很感激一些反馈。谢谢!
我有一个应用程序正在执行一些内存密集型任务。我试图弄清楚总可用内存是多少以及可用的空闲内存是多少。我这样做是通过使用Runtime.getRuntime().freeMemory()
和Runtime.getRuntime().totalMemory()
我很好奇我得到的结果是设备上的可用内存总量和总内存量,还是应用程序在其上运行的 Dalvik VM 实例可用的内存总量?我会很感激一些反馈。谢谢!
根据 JavaDocs,这些应该是根据您的进程的堆。话虽如此:
getMemoryClass()
onActivityManager
是一种更适合 Android 的方式来确定进程的堆大小。
因为 Dalvik 的垃圾收集器是非压缩的,所以由类似方法报告的内存freeMemory()
会夸大您可以分配多少。通过“非压缩”,我的意思是,如果您释放恰好相邻的两个内存块,垃圾收集器会将它们保留为两个内存块。将此与 Java VM 进行对比,Java VM 将识别出两个块是相邻的并更新堆以反映一个较大的空闲块而不是两个较小的空闲块。非压缩垃圾收集器意味着您的堆比完全耗尽更容易产生碎片。您将尝试分配一些大块并获得一个OutOfMemoryError
,不是因为堆缺少空闲内存,而是因为没有单个空闲块足以满足您的请求。