android - 有没有办法压缩android中的内存以降低高水位线?

标签 android memory memory-management out-of-memory

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

我最近编写了一个进行图像处理的安卓应用。图像作为位图加载,然后以像素为单位复制出来,以使用大量内存的方式进行处理(想想浮点表示中的傅立叶变换等),然后转换回位图并保存。

问题是,至少通过 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/

相关文章:

java - 使用两个 Activity [ANDROID] 显示消息输出的问题

java - 找不到创建可执行jar的主类

android - 如何在 Android 上自定义 facebook 登录屏幕?

c++ - 嵌套 C++ vector 的重新分配

android - iOS 和 Android 的 HTML 5 文件输入 [Cordova/Phonegap]

objective-c - dealloc 后对象没有释放

c++ - 混淆 C++ prime 加上动态数组的例子

Java MemoryClassLoader(IllegalArgumentException)

memory-management - ARM Linux 页表布局

c - Realloc 函数无法正常工作?