安卓:调用垃圾回收器的哪种方法更好?

5

我的应用程序出现了一些内存不足的问题,想要调用垃圾回收器,但我不确定应该在哪个方法中调用它。

这是我的代码:

 public static void CleanUpMemory(){
    System.runFinalization();
    Runtime.getRuntime().gc();
    System.gc();
 }

目前我在onStop()中调用这个方法,但是在onDestroy()中调用它会更好吗?


你是否正在执行一些占用大量内存的操作,例如创建位图? - Aritra Roy
是的,我正在使用通用图像加载器。 - user5035668
假设这样做不会帮助你。如果有内存泄漏,你需要解决它们。 - user468311
答案是无处。在任何情况下都不应该调用GS。我的意思是手动调用它根本没有意义。唯一的影响就是浪费CPU周期。 - Vladyslav Matviienko
3个回答

1

手动调用 GC 永远不是一个好的实践。Dalvik 或 ART 比我们更清楚何时进行垃圾回收。

如果您的应用程序需要大量内存来处理昂贵的操作,则这是一个好的解决方案。

<application
....
   android:largeHeap="true"> 

0

最好让垃圾回收器独自工作。

当需要回收内存时,它会开始工作。

请注意,调用System.gc()仅是建议在确实需要时启动gc的方法。

来自javadoc:

调用gc方法建议Java虚拟机将努力回收未使用的对象,以便使它们当前占用的内存可快速重用。当从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。

尝试使用改进来使用更少的内存,而不是显式调用gc(缓存对象、使用池等)。


好的,但我的问题是内存错误,并且它们是在调用异步任务-> doInBackground() 方法时发生的。 - user5035668
大多数情况下,OOM 不会在问题所在的地方抛出。使用分析工具查看它占用了所有内存的位置并进行修复(如果可能)。 - Marco Acierno
OutOfMemory错误不能通过调用gc来解决。您需要调整应用程序以使用更少的内存。调用gc仅有助于请求更频繁的垃圾回收以减少每次垃圾回收的时间,但是还有其他技术可以使用,而不是手动调用它。 - Davide Lorenzo MARINO

0

在您的活动中直接调用gc()并不是一个好的做法(JVM知道何时运行它)。

如果您遇到内存问题,请尝试使用MAT查找应用程序中的内存泄漏。

此外,System.gc()调用不会强制进行垃圾回收。Dalvik决定何时运行gc。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接