【问题标题】:Getting amount of free memory and total available memory获取可用内存量和可用内存总量
【发布时间】:2013-09-08 23:10:41
【问题描述】:

我有一个应用程序正在执行一些内存密集型任务。我试图弄清楚总可用内存是多少以及可用的空闲内存是多少。我这样做是通过使用Runtime.getRuntime().freeMemory()Runtime.getRuntime().totalMemory()

我很好奇我得到的结果是设备上的可用内存总量和总内存量,还是应用程序在其上运行的 Dalvik VM 实例的可用内存总量?我会很感激一些反馈。谢谢!

【问题讨论】:

    标签: android memory memory-management virtual-machine dalvik


    【解决方案1】:

    根据 JavaDocs,这些应该是根据您的进程的堆。话虽这么说:

    • getMemoryClass() on ActivityManager 是一种更适合 Android 的方式来确定进程的堆大小。

    • 由于 Dalvik 的垃圾收集器是非压缩的,freeMemory() 等方法报告的内存会夸大您可以分配的内存量。通过“非压缩”,我的意思是,如果您释放恰好相邻的两个内存块,垃圾收集器会将它们保留为两个内存块。将此与 Java VM 进行对比,Java VM 将识别出两个块是相邻的,并更新堆以反映一个较大的空闲块,而不是两个较小的空闲块。非压缩垃圾收集器意味着您的堆比完全耗尽更容易产生碎片。您将尝试分配一些大块并获得OutOfMemoryError,这不是因为堆缺少空闲内存,而是因为没有足够大的空闲块满足您的请求。

    【讨论】:

    • “如果你释放了恰好相邻的两个内存块,垃圾收集器会将它们作为两个内存块保留。”这是不正确的。如果块真正相邻,它们将被合并。 Dalvik 的 GC 不会压缩或复制,这意味着:正在使用的内存块不会移动到新位置。
    • @danfuzz:感谢您的澄清!但是,总体观点仍然存在,因为堆碎片(没有一个足够大的块)仍然是一个重要问题,排除了以有用的方式测量“空闲内存”的任何简单方法。
    • 确实如此。我不打算与那个争论。
    猜你喜欢
    • 2020-02-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多