请注意我没有内存泄漏。我的问题是关于一个更微妙的问题。
我最近编写了一个进行图像处理的安卓应用。图像作为位图加载,然后以像素为单位复制出来,以使用大量内存的方式进行处理(想想浮点表示中的傅立叶变换等),然后转换回位图并保存。
问题是,至少通过 android OS 2.3,总内存限制(通常为 16MB)结合了 java 和(外部存储的)位图,并且 java 高水位线甚至没有下降(我可以辨别)当内存空闲时(成功 GC'd),这意味着当我去分配最终位图时,我经常“内存不足”,即使到那时我已经释放(和 GC'd)大部分空间。即,我从不需要一次完整的 16MB,但为位图留下的空间似乎是 16MB 减去 MAX 历史 Java 堆使用量(与当前使用量相反)。
我观看了一位 android 开发人员关于内存问题的技术演讲,他暗示此问题已在操作系统的后续版本中得到修复(他们将位图内存移至 java 堆空间),但与此同时,大多数想要使用我的应用的人正在运行 2.2 或 2.3。
长话短说,我想知道 java 堆是否曾经被压缩(实际上是去 fragment 化)以使高水位标记缩小(如果是,如何实现)?
如果没有,那么有人对如何处理这个问题有其他建议吗?
最佳答案
Long story short, I am wondering if the java heap is ever compacted (de-fragmented, in effect) so that the high-water mark shrinks (and if so, how to make it happen)?
不管它的行为是什么,它肯定不在你的控制之下。
If not, then does anybody have another suggestion how to deal with this problem?
理想情况下,重用您自己的位图
。您没有指出“以使用大量内存的方式处理”到底是什么。但是,如果它不改变图像的尺寸或位深度,请将数据复制回原始 Bitmap
,而不是分配一个新的,如果可以的话。
Android 2.x 上的图像处理是少数几个我认为可以证明使用多个进程的地方之一。您将增加在进程之间整理图像数据的开销,但另一个进程有自己的堆(Java 和 native ),因此这可能会给您更多的“肘部空间”。
关于android - 有没有办法压缩android中的内存以降低高水位线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6678851/