Java Android Studio是如何启动垃圾收集器的?它是如何工作的?

Java Android Studio是如何启动垃圾收集器的?它是如何工作的?,java,android,garbage-collection,Java,Android,Garbage Collection,我很难找到可能的内存泄漏。 我有一个活动,在后台做一些繁重的工作 完成某些任务后,应用程序会消耗太多内存。看起来它没有得到很好的清理 这是默认状态下的活动: 如果我运行活动正在执行的任务,则会分配越来越多的内存 工作后的活动: 起初我认为这一定是内存问题,因为GC无法正确释放内存。据我所知,如果没有对对象的引用,GC可以释放内存。对吗 现在是让我困惑的部分: 如果我从androidstudio运行GC,内存会被正确清理,我的活动也不会关闭。我只需要在分配了太多内存时使用Android Stu

我很难找到可能的内存泄漏。 我有一个活动,在后台做一些繁重的工作

完成某些任务后,应用程序会消耗太多内存。看起来它没有得到很好的清理

这是默认状态下的活动:

如果我运行活动正在执行的任务,则会分配越来越多的内存

工作后的活动:

起初我认为这一定是内存问题,因为GC无法正确释放内存。据我所知,如果没有对对象的引用,GC可以释放内存。对吗

现在是让我困惑的部分:

如果我从androidstudio运行GC,内存会被正确清理,我的活动也不会关闭。我只需要在分配了太多内存时使用Android Studio GC。

这就是我的意思:

一般来说,问题是:

为什么androidstudiogc可以正确清理内存,为什么它不能与自动androidgc一起正常工作

我知道这是一个相当普遍的问题。我只是想知道,是否有不同类型的垃圾收集或类似的东西

还调用
System.gc()未正确清理内存

其他信息:

摩托G第二代


Android 5.0.2。

也许您可以尝试显式调用
System.gc()在繁重的处理代码中周期性地出现在某个地方?

内存泄漏可能是由于以下几个原因造成的。一个常见的原因是位图不能正确回收。内存泄漏的另一个种子是将上下文保留在对象中。例如,您启动一个异步任务并传递一个上下文,因为您以后需要它。当异步任务运行时,它保留对上下文的引用,因此整个活动都在内存中。这在匿名类和内部类中也很常见,它们引用父类,父类通常是片段或活动


我建议您使用库泄漏金丝雀来发现内存泄漏,并使用Android工具跟踪分配,以便准确发现内存泄漏发生的位置。

“有时,活动或应用程序会关闭。我认为这可能是内存问题造成的。”如果应用程序b/c死亡,内存不足,您将得到一个内存不足异常,您可以在Logcat中清楚地看到。我的预感是,你的应用程序正在崩溃的另一个原因。尝试通过logcat查看崩溃原因。并发GC只进行部分收集,以免引起明显的暂停。由Studio触发的显式GC执行完整的GC扫描。一些人写道:@Shmuel没有例外。甚至没有警告。@oberflanch这是什么手机?安卓操作系统版本?请尽可能多地更新帖子。@Shmuel感谢您的帮助。我知道,很难相信这个应用程序被关闭了。这可能与android版本有关。但我通常对GC行为感兴趣。对不起,如果我没有说清楚的话。最后一期只是一些背景资料。对不起,我忘了。我已经试过了,但它不起作用。如果确实存在内存泄漏,那么调用System.gc()对b/c没有帮助,内存仍然会通过代码中的某个引用保留。@Shmuel True,但OP说当他按下android studio上的gc按钮时,应用程序不会崩溃,我想这是在调用
System.gc()
,因此,我的建议是,我不认为应用程序会因为内存泄漏而崩溃。这些症状听起来不像是记忆问题。谢谢你的回答。您提到了常见的原因,内存泄漏是如何发生的。基本上这都是因为剩下的参考文献是正确的。但在我的例子中,androidstudio的GC调用正确地清理了一切。因此,如果有一些奇怪的引用,GC应该不能正确地清理它们?不完全是这样。您可以退出一个活动,但仍将引用保留几秒钟。因此,当您在几秒钟后运行GC时,它将清理内存。我面临的情况是,我从几个活动中返回,内存溢出,因为可能位图被回收,并延迟GC释放内存,因此内存不足。默认情况下,如果没有必要,GC不会释放内存(未达到允许的最大内存量)。这也可能是你的另一个问题。我很高兴看到这个帖子,而且它是最近的。你@oberflanch找到android studio的GC工作得更好的原因了吗?我正在处理应用程序将我抛出内存并导致程序崩溃的相同情况。我在我的应用程序中发现导致内存问题的一个原因是,我在资源中使用的所有PNG图像都太大了。我想知道为什么android在一个活动关闭后,即使类中的所有引用都关闭了,它自己也不GC。。。每次创建新活动时,内存都会不断增加,直到die@CaoFelix好吧,我不会说这更好。。。默认的Android GC仅在需要时才尝试清理内存。androidstudiogc完成了一个完整的GC,并尝试释放所有内容。(这需要更多的时间,并可能导致更多的滞后)。最后我的问题是,gfx内存没有被正确清理(内存跟踪器中没有包含)。这导致了内存泄漏。因此,有时GC并不需要GC,因为它认为还不需要(对于堆)。