我注意到我在#34;满载情况下使用了近93%的内存" (我的最高内存消耗模式)。
我的第一个问题 我使用了很多相对较小的drawables。我使用LRUCache缓存它们,并确保我释放LRUCache,如果不再需要的话。 93%的启动方式是多少还是堆的正常行为,他分配了那么多内存?
旋转之后,我注意到堆正在增加,逻辑上我的内存消耗(percantage)正在减少。
第二个问题
为什么会这样?我几乎完全一样,我只使用了更多的内存。
启动后
一次轮换后
通知
我没有内存泄漏,至少没有一个足够大,我能够注意到的。 堆消耗总是在2-4%的范围内振荡。
答案 0 :(得分:0)
旋转图像时,底层软件可能会使用旋转矩阵为您执行此操作。这是一段额外的内存,必须放入堆中一段时间。但是,如果堆中没有足够的连续空间,JVM会增加堆大小以适应您的额外数据。当对该数据的所有引用都丢失时,GC会静默释放此内存,但堆大小保持不变以供将来使用。这是因为使用已经由操作系统分配的内存通常更快,然后释放内存页并每隔一段时间从OS请求新内存。实际上,Java具有启发式功能,可以告诉它何时减少堆大小,例如,在一段时间之后,当大部分堆未被使用时。
Here您可以找到一些控制(Oracle)Java启发式的选项。我相信其中一些也适用于Android Dalvik JVM。