Android 堆大小在旋转后增加?

Android 堆大小在旋转后增加?,android,memory,memory-management,heap-memory,Android,Memory,Memory Management,Heap Memory,我注意到我在“满负荷”(我的最高内存消耗模式)下使用了将近93%的内存 我的第一个问题 我用了很多抽绳,比较小。我用一个LRUCache缓存它们,如果里面不再需要什么东西,我肯定会释放LRUCache。启动时93%的内存是分配给堆的内存太多还是堆的正常行为 旋转之后,我注意到堆在增加,逻辑上我的内存消耗(percantage)在减少 第二个问题 为什么会发生这种情况?我做的几乎完全一样,我只使用了多一点的内存 启动后 一次旋转后 注意 我没有内存泄漏,至少没有一个足够大,我可以注意到。 堆

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

我的第一个问题 我用了很多抽绳,比较小。我用一个LRUCache缓存它们,如果里面不再需要什么东西,我肯定会释放LRUCache。启动时93%的内存是分配给堆的内存太多还是堆的正常行为


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

第二个问题

为什么会发生这种情况?我做的几乎完全一样,我只使用了多一点的内存

启动后

一次旋转后

注意

我没有内存泄漏,至少没有一个足够大,我可以注意到。
堆消耗始终在2-4%的范围内振荡。

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


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

是的,你是对的,我自己已经弄明白了,但是一个很好的答案!您还可以通过以下方式检测memoryClass:通过
ActivityManager
getMemoryClass()
来检测memoryClass(),它会以MB为单位返回“您对应用程序不会出现问题的值很满意”。通过
Runtime.getRuntime().MaxMemory
为应用程序提供的最大可用堆(字节)!