问题

我看过很多Android答案,建议在某些情况下调用垃圾收集器。

在进行内存耗尽操作之前,在Android中请求垃圾收集器是一个好习惯吗?如果没有,如果我得到一个OutOfMemory错误,我应该只打电话吗?

在使用垃圾收集器之前还有其他我应该使用的东西吗?


#1 热门回答(132 赞)

对于3.0之前的版本蜂窝:是的,请致电System.gc()

我试图创建Bitmaps,但总是得到"VM内存不足错误"。但是,当我第一次致电System.gc()时,没关系。

在创建位图时,Android经常因内存不足而失败,并且不会先尝试垃圾回收。因此,callSystem.gc(),你有足够的内存来创建位图。

如果创建对象,我认为如果需要,我会自动调用System.gc,但不能创建位图。它失败了。

所以我建议在创建位图之前手动调用System.gc()


#2 热门回答(113 赞)

一般来说,在存在垃圾收集器的情况下,手动调用GC是不合时宜的做法。 GC围绕启发式算法进行组织,这些算法在放置到自己的设备时效果最佳。手动调用GC通常会降低性能。

偶尔,在一些相对罕见的情况下,人们可能会发现某个特定的GC出错了,然后手动调用GC可能会改善性能。这是因为实际上不可能实现"完美"GC,它将在所有情况下以最佳方式管理内存。这种情况很难预测,并取决于许多微妙的实施细节。 "良好实践"是让GC独立运行;手动调用GC是一个例外,只有在实际性能问题得到适当见证后才能设想。


#3 热门回答(25 赞)

如果我们没有正确处理位图,Android应用程序中的内存很常见,问题的解决方案就是

if(imageBitmap != null) {
     imageBitmap.recycle();
     imageBitmap = null;
}
System.gc();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 3;
imageBitmap = BitmapFactory.decodeFile(URI, options);
Bitmap  scaledBitmap = Bitmap.createScaledBitmap(imageBitmap, 200, 200, true);
imageView.setImageBitmap(scaledBitmap);

在上面的代码中刚刚尝试回收位图,这将允许你释放已用的内存空间,因此可能不会发生内存不足。我试过它对我有用。

如果仍然遇到问题,你也可以添加这些行

BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[16*1024];
options.inPurgeable = true;

有关更多信息,请查看此链接
http://voices.yahoo.com/android-virtual-machine-vm-out-memory-error-7342266.html
注意:由于执行gc导致的瞬间"暂停",建议不要在配置之前执行此操作。

最佳设计是:

  • 通过显示的if / recycle / nullcode释放不再需要的所有位图。 (制定方法来帮助解决这个问题。)
  • System.gc();
  • 分配新的位图。

原文链接