我看过很多Android回答,建议在某些情况下调用垃圾收集器。
在执行耗用内存的操作之前,在Android中请求垃圾收集器是一种好的做法吗?如果不是,我应该只在收到OutOfMemory
错误时才调用它吗?
在求助于垃圾收集器之前,有没有其他我应该使用的东西?
发布于 2016-02-18 20:52:17
似乎System.gc()
不能在Art Android6.0.1Nexus5x上工作,所以我用Runtime.getRuntime().gc();
代替。
发布于 2014-07-18 20:06:02
一般来说,您不应该使用System.gc()显式调用GC。甚至还有IO讲座(http://www.youtube.com/watch?v=_CruQY55HOk),在那里他们解释了GC暂停日志的含义,并且还声明永远不要调用System.gc(),因为Dalvik比您更清楚何时调用。
另一方面,正如在上面的回答中提到的,Android中的GC过程(就像其他任何东西一样)有时会有buggy。这意味着Dalvik GC算法无法与Hotspot或JRockit JVM相提并论,在某些情况下可能会出错。其中一种情况是分配位图对象。这是一个棘手的问题,因为它使用堆和非堆内存,而且在内存受限的设备上,一个松散的位图对象实例就足以给出一个OutOfMemory异常。因此,在不再需要这个位图之后调用它通常是许多开发人员的建议,甚至被一些人认为是很好的做法。
一种更好的做法是在位图上使用.recycle(),因为它就是这个方法的用途,因为它将位图的本机内存标记为可以安全删除。请记住,这非常依赖于版本,这意味着在较早的Android版本(我认为是3.0之前)上通常会需要它,但在以后的版本中不会需要。此外,在较新的版本上使用它也不会有太大影响(只是不要在循环或类似的东西中这样做)。新的艺术运行时在这里改变了很多,因为他们为大对象引入了一个特殊的堆“分区”,但我认为用艺术以太做这件事不会有太大伤害。
关于System.gc()还有一个非常重要的注意事项。此方法不是Dalvik (或JVM)必须响应的命令。考虑一下,这更像是对虚拟机说:“如果不麻烦的话,你可以做垃圾收集吗?”
发布于 2014-07-27 18:26:15
我的应用程序管理了很多图片,但它死于OutOfMemoryError。这对我很有帮助。在Manifest.xml中添加
<application
....
android:largeHeap="true">
https://stackoverflow.com/questions/3117429
复制相似问题