请注意,我并没有内存泄漏。我的问题与更微妙的问题有关。
最近我编写了一个Android应用程序,用于图像处理。图像作为位图加载,然后以像素形式复制出来,在使用大量内存的方式下进行处理(例如浮点表示中的傅里叶变换等),然后转换回位图并保存。
问题是,至少在Android OS 2.3及以下版本中,总内存限制(通常为16MB)是Java和(外部存储的)位图的组合,而当内存被释放(成功GC'd)时,Java高水位线不会下降(据我所知),这意味着当我要分配最终的位图时,即使在那时我已经释放了(并GC'd了)大部分空间,我经常会“内存不足”。也就是说,我从来不需要一次性使用全部16MB,但是留给位图的空间似乎是16MB减去MAX历史Java堆使用情况(而不是当前使用情况)。
我看了一个由Android开发人员之一提供的技术讲座,讲述了内存问题,他暗示这个问题已经在操作系统的后续版本中得到解决(他们将位图内存移入Java堆空间),但同时大多数想使用我的应用程序的人正在运行2.2或2.3。
长话短说,我想知道Java堆是否会被压缩(在实际上被碎片化的情况下),以便高水位线收缩(如果有的话,如何使其发生)?
如果不是这样,那么有没有其他建议来解决这个问题?
最近我编写了一个Android应用程序,用于图像处理。图像作为位图加载,然后以像素形式复制出来,在使用大量内存的方式下进行处理(例如浮点表示中的傅里叶变换等),然后转换回位图并保存。
问题是,至少在Android OS 2.3及以下版本中,总内存限制(通常为16MB)是Java和(外部存储的)位图的组合,而当内存被释放(成功GC'd)时,Java高水位线不会下降(据我所知),这意味着当我要分配最终的位图时,即使在那时我已经释放了(并GC'd了)大部分空间,我经常会“内存不足”。也就是说,我从来不需要一次性使用全部16MB,但是留给位图的空间似乎是16MB减去MAX历史Java堆使用情况(而不是当前使用情况)。
我看了一个由Android开发人员之一提供的技术讲座,讲述了内存问题,他暗示这个问题已经在操作系统的后续版本中得到解决(他们将位图内存移入Java堆空间),但同时大多数想使用我的应用程序的人正在运行2.2或2.3。
长话短说,我想知道Java堆是否会被压缩(在实际上被碎片化的情况下),以便高水位线收缩(如果有的话,如何使其发生)?
如果不是这样,那么有没有其他建议来解决这个问题?