活动垃圾收集

Posted

技术标签:

【中文标题】活动垃圾收集【英文标题】:Garbage Collection of Activities 【发布时间】:2015-10-12 18:28:03 【问题描述】:

如果我没记错的话,Activity 对象永远不会从内存中销毁,它们一直存在,直到进程被杀死。所以调用finish()或android操作系统销毁你的Activity并不意味着它在内存中被销毁,而只是意味着它现在处于“销毁状态”(非官方名称)。

为了演示,我确实覆盖了我的活动的 finalize 方法,然后从另一个活动的按钮单击事件中使用了 System.gc()。我看到我的活动的 finalize 方法正在被调用。如果 Activity 对象在进程运行时不能被销毁,那么如何对 Activity 进行垃圾回收呢?

【问题讨论】:

您是否尝试过“使用完成(),然后使用 System.exit(0) 清除静态变量。”? ***.com/a/12029017/866333 【参考方案1】:

如果没有更多对活动的引用,那么它会被垃圾收集 - 但泄漏活动真的很容易 - 这表示现在有一个非常好的工具来查找活动泄漏:https://github.com/square/leakcanary 此外,仅在调用 onDestroy() 之后才对 Activity 进行 GC - 而不是直接在 finish() 之后 - 因此您的测量不起作用

【讨论】:

这真的很糟糕,因为活动真的很重 - 这是错误的,或者你只是错过了 - 你可以给我一个链接吗? ***.com/questions/7536988/… @InsignificantPerson 这个答案说操作系统内存管理只关注整个进程,而不是单个活动。它没有说明进程内 GC 行为。 @InsignificantPerson:“这里的许多人,包括 Dianne Hackborn(也是/曾经是 Android 开发者小组的成员)都表示,当进程仍在运行时,活动永远不会从内存中清除”——不,她确实如此不是。你可以通过actually reading what she wrote 来判断。由于内存不足,活动没有主动删除;除此之外,它们的行为就像普通的 Java 对象。 对不起,我误会了,请澄清一下。【参考方案2】:

每个Activity进程 都保存在内存中,直到需要空间或用户强行将其从进程管理器(如最近列表)中删除(按住主页/中间按钮)。

这是MRU 缓存模式。在Activityfinish() 和/或onDestroy 退出后,它不会剩下太多了,但是JVM 需要大量设置,因此仅在假设它在预期之前使用它的前提下保留将来需要。除非你需要内存来做其他事情。

【讨论】:

以上是关于活动垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章

java 垃圾收集

Java虚拟机垃圾收集器分析 基本回收算法 垃圾回收器

Java虚拟机垃圾收集器分析 基本回收算法 垃圾回收器

Java虚拟机垃圾收集器分析 基本回收算法 垃圾回收器

搞懂G1垃圾收集器

Java开发中啥是垃圾回收?