【问题标题】:Heap Size increasing after Rotation?旋转后堆大小增加?
【发布时间】:2015-02-21 08:26:57
【问题描述】:

我注意到我在“满负荷”(我的最高内存消耗模式)下使用了近 93% 的内存。

我的第一个问题 我使用了很多drawables,相对较小。我用 LRUCache 缓存它们,如果不再需要某些东西,我肯定会释放 LRUCache。启动时 93% 是多少还是他分配那么多内存的堆的正常行为?


旋转后,我注意到堆在增加,逻辑上我的内存消耗(百分比)在减少。

第二个问题

为什么会这样?我做的几乎完全一样,我只使用了一点点内存。

启动后

旋转一圈后

通知

我没有内存泄漏,至少没有一个大到我能够注意到的内存泄漏。 堆消耗始终在 2-4% 的范围内波动。

【问题讨论】:

    标签: android memory memory-management heap-memory


    【解决方案1】:

    当您旋转图像时,底层软件可能会使用旋转矩阵为您执行此操作。这是必须暂时放入堆中的额外内存量。但是,如果堆中没有足够的连续空间,JVM 会增加堆大小以适应您的额外数据。当对该数据的所有引用都丢失时,GC 会静默释放该内存,但堆大小保持不变以备将来使用。这是因为使用操作系统已经分配的内存通常更快,然后释放内存页面并每隔一段时间从操作系统请求新的内存页面。实际上,Java 具有启发式方法,可以告诉它何时减小堆大小,例如,在一段时间后,当大部分堆没有被使用时。

    Here 您可以找到一些控制 (Oracle) Java 启发式的选项。我相信其中一些也适用于 Android Dalvik JVM。

    【讨论】:

    • 是的,你是对的,我自己已经想通了,但是一个很好的答案!您还可以通过以下方式检测 memoryClass:在 ActivityManagergetMemoryClass() 上,它会返回一个“您的应用程序不会出现问题的值”,以 MB 为单位。 Runtime.getRuntime().MaxMemory 为您的应用程序提供的最大可用堆以字节为单位!
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2016-10-13
    • 2014-10-24
    • 2012-12-07
    • 2013-01-26
    • 2014-05-13
    • 2015-11-22
    • 2010-11-24
    相关资源
    最近更新 更多