Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在代码中动态清空或清除堆内存_Android_Gallery_Heap Memory_Coverflow - Fatal编程技术网

Android 如何在代码中动态清空或清除堆内存

Android 如何在代码中动态清空或清除堆内存,android,gallery,heap-memory,coverflow,Android,Gallery,Heap Memory,Coverflow,在我的应用程序中,我同时使用simple gallery和coverflow 我在coverflow中点击了我的coverflow图像库,我被重定向到下一个包含全屏图像库内容的活动,我甚至可以滚动我的全屏图像库; 但当我在我的应用程序中放入更多的图像或高分辨率图像时,由于位图大小超过虚拟机预算,它会被强制关闭 所以我想在每次完成封面流和图库时清除堆内存,这样我就可以在我的应用程序中加载任意数量或任意分辨率的图像 所以如果有人能帮我。。。 如何在每次在代码中动态完成活动时清除/清空堆内存? 我已经

在我的应用程序中,我同时使用simple gallery和coverflow 我在coverflow中点击了我的coverflow图像库,我被重定向到下一个包含全屏图像库内容的活动,我甚至可以滚动我的全屏图像库; 但当我在我的应用程序中放入更多的图像或高分辨率图像时,由于位图大小超过虚拟机预算,它会被强制关闭

所以我想在每次完成封面流和图库时清除堆内存,这样我就可以在我的应用程序中加载任意数量或任意分辨率的图像 所以如果有人能帮我。。。 如何在每次在代码中动态完成活动时清除/清空堆内存? 我已经尝试了回收和System.gc方法

您无法“清除堆”。当您的对象不再被引用时,VM将自动执行此操作

话虽如此,位图在安卓系统中是一件棘手的事情。内存有限,当图像解码成位图时,它可能比压缩图像格式本身占用更多内存

你的解决方案没有简单的答案。即使你做的每件事都正确,你也可能只是内存不足。尽管如此,以下是一些提示:

  • 使用位图.release()。位图的特殊之处在于它们是在本机堆栈(而不是VM)堆上分配的。javadocs有点模糊,说您通常不需要调用它,但根据我的经验,这个“线索”对VM来说很重要,因为您使用支持位图的内存完成了操作编辑:从Android 3.0(API级别11)开始,像素数据与相关位图一起存储在Dalvik堆上。

  • 将位图加载到内存中。这里有一个关于这个话题的例子。在某些设备上只能获得24MB的堆,而高分辨率图像在加载到位图对象时可能会耗尽所有这些。没有办法,所以你必须按比例加载它

  • 不要像另一个答案所说的那样调用
    System.gc()。构建GC算法的人比你我都聪明;他们知道自己在做什么。当有可以通过GC释放的内存时,您永远不会得到OOME—GC总是在给您OOME之前运行

  • 这一点很明显,但请确保在不再需要位图时不保留对位图的引用

  • 最后,这个很糟糕,Android不做堆压缩。这是我不久前贴在上面的一封信,没有令人满意的答复。简言之,Android从不压缩堆,因此当你的应用程序不断为位图分配大的、甚至中等大小的块时,你最终会陷入这样一种情况:虽然你没有内存不足,但没有足够大的连续内存块供你分配,而你得到了OOME。正如我在问题中所写的那样,解决这个问题的唯一方法是在用户退出时终止应用程序的进程。这使得下次启动速度变慢,但它保证了一个全新的堆。别误会我的意思,我不可能相信这是正确的做法,但没有人能想出更好的解决办法


  • 你可以看看romain guy所说的关于图形和位图的内容。很好地解释了romain的信息+1。这不是“romain的信息”。我不知道你指的是什么。他是谷歌ui工具包工程师之一。你刚才说的基本上就是他说的。他的名字是handle是Rominguy。当用户退出时,你怎么能终止应用程序的进程?