臭名昭着的“超过虚拟机预算”问题

时间:2011-11-30 03:40:03

标签: android garbage-collection bitmap heap out-of-memory

所以我有一个APP循环并不断地将许多png文件绘制到画布上。在线程的构造函数中,对于某些png,我声明了Drawable和一些Bitmap句柄并分别(如下)分配它们:

 Drawablename = context.getResources().getDrawable(R.drawable.pngresource);
 mBackgroundImage = BitmapFactory.decodeResource(res, R.drawable.bckgrnd);

请记住,我做了两种方法,很多次。 (尽管大多数图像都相当小)

嗯......我遇到的问题是,当尝试在旧设备上启动此应用程序时(特别是原来的机器人和旧版本),它会因VM预算错误而关闭。

从研究中,我注意到这似乎是一个常见的问题。 (该应用程序适用于所有较新的设备,如droid x,每个平板电脑最好买,充电,atrix等。)

所以我的问题是我可以做得更好吗?

这些引用pngs的方法之一是否优越? 这究竟发生了什么?我需要能够随时引用图像进行绘制。换句话说,在任何给定的瞬间,我都可以在其中一个手柄上调用Draw。

我见过类似问题的修复涉及调用垃圾收集器,但这对我有帮助,因为我以后还需要这些图像?或者这是我从drawable文件夹引用png的方式的问题?

抱歉,如果这令人困惑,我是初学者。

如果我在每个引用之后调用System.gc()会有帮助,即使引用仍然存储为Drawable对象?

1 个答案:

答案 0 :(得分:4)

常见修复:

  1. 调整图片大小,例如:createScaledBitmap() ...
  2. 降低图像质量,Config.inSampleSize设置......
  3. 在未使用时删除对Bitmap个对象的所有引用(当然,设置对NULL的引用)。如果你不这样做,System.gc()将什么都不做,记住这一点!并且此方法调用不保证将立即释放内存。