有没有办法在Android中压缩内存以降低高水位?

Bra*_*dyn 9 memory android memory-management out-of-memory

请注意我没有内存泄漏.我的问题是一个更微妙的问题.

我最近写了一个Android应用程序,它进行图像处理.图像作为位图加载,然后以像素复制,以使用大量内存的方式处理(考虑浮点表示和填充中的傅里叶变换),然后转换回位图并保存.

问题是,至少通过android OS 2.3,总内存限制(通常为16MB)是组合java和(外部存储)位图,并且即使在内存中,java高水位标记也不会下降(我可以辨别)是免费的(成功GC'd),这意味着当我去分配最终的位图时,我经常"内存不足",即使到那时我已经释放了(和GC'd)大部分空间.即,我从来不需要一次完整的16MB,但是Bitmaps留下的空间似乎是16MB减去MAX历史java堆的使用量(与当前使用情况相反).

我看了一个Android开发人员关于内存问题的技术演讲,他暗示这个问题已经在操作系统的后续版本中得到修复(他们将Bitmap内存移动到java堆空间中),但与此同时大多数人都希望使用我的应用正在运行2.2或2.3.

长话短说,我想知道java堆是否曾被压缩(实际上是去碎片),以便高水位标记缩小(如果是这样,如何实现它)?

如果没有,那么有人有另一个建议如何处理这个问题?

Com*_*are 1

长话短说,我想知道java堆是否曾经被压缩(实际上是碎片整理),以便高水位线缩小(如果是这样,如何实现它)?

无论它的行为是什么,它肯定不受您的控制。

如果没有,那么有人有其他建议如何处理这个问题吗?

理想情况下,重复使用您自己的Bitmaps. 您没有指出“以使用大量内存的方式处理”到底是什么。但是,如果它不会更改图像的尺寸或位深度,请将数据复制回原始数据,Bitmap而不是分配新的数据(如果可以的话)。

Android 2.x 上的图像处理是我可以看到使用多个进程的少数几个地方之一。您将增加在进程之间传输图像数据的开销,但另一个进程有自己的堆(Java 和本机),因此这可能会给您更多的“肘部空间”。