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

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

我最近写了一个Android应用程序,它进行image processing。 图像被加载为一个位图,然后复制出来的像素,处理的方式,使用大量的内存(思考傅里叶变换浮点表示和东西),然后转换回位图并保存。

问题是,至less通过android操作系统2.3,总内存限制(通常16MB)是结合Java和(外部存储)位图,并且Java高水位不下降(我可以辨别),即使在内存是免费的(成功GC'd),这意味着当我去分配最终的位图,我经常“内存不足”,即使到那时我已经释放(和GC'd)的大部分空间。 也就是说,我从来不需要全部16MB的空间,但是Bitmaps剩下的空间就是16MB,减去最大的历史java堆使用量(相对于当前的使用量)。

我看了一个android开发人员关于内存问题的技术讨论,他暗示这个问题已经在后续版本的操作系统(他们把位图内存移动到java堆空间)中得到了解决,但同时大多数人想要使用我的应用程序正在运行2.2或2.3。

长话短说,我想知道如果Java堆是压缩(去碎片,有效),以便高水位收缩(如果是这样,如何使它发生)?

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

Solutions Collecting From Web of "有没有办法在android中压缩内存来降低高水位?"

长话短说,我想知道如果Java堆是压缩(去碎片,有效),以便高水位收缩(如果是这样,如何使它发生)?

不pipe它的行为是什么,它肯定不在你的控制之下。

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

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

Android 2.x上的image processing是我可以看到使用多个进程的less数几个地方之一。 你将会在进程之间增加图像数据的开销,但另一个进程有自己的堆(Java和native),所以这可能会给你更多的“肘部空间”。

到目前为止,没有迹象表明有任何方法来压缩内存。

这是我的解决方法,这是不理想的,但比以前的行为更好:

我现在故意保留原来的位图,而我正在做我的处理,然后recycle()和null,GC(),但直到分配我的输出位图之前。

这是保留外部(位图)空间,并导致我的应用程序用完Java堆(在处理过程中,在调用recycle()之前),我至less可以通过重试一个较小的图像来捕获和处理。 (之前,一切似乎都没有问题,直到我试图拯救,但那时已经太迟了,无法恢复。)

从技术上讲,这限制了我的最大图像大小,比我应该能够使用分配的内存要less(因为我需要在堆和外部同时预留空间,实际上我从来都不需要这两者),但至less我仍然可以处理合理的图像尺寸。

之前发生的事情是,我会尽早释放并回收Bitmap,这使得Java堆上的高水位基本上占用了我所有的内存分配,这意味着从这一点开始,我无法打开或创build任何更多的Bitmap (有时候不包括微缩尺寸)。

Imo,这是android处理位图内存的一个主要bug,但是我相信它在新版本的操作系统中是固定的,所以希望我可以在操作系统版本上禁用这个解决方法。

我假设你已经调用Bitmap.recycle()但这是我记住的唯一的事情,你没有谈论。