当应用在后台时,哪些类型的数据可以被垃圾收集?

时间:2013-07-03 09:00:01

标签: android garbage-collection

假设我从活动A开始 - >活动B.在活动B中,我按回家退出。很长一段时间后,可能会调用gc,因为其他应用程序具有更高的优先级。我的问题是,以下哪种类型的数据将被垃圾收集(我很确定静态字段可以随时进行垃圾收集,但我不确定这些:)

i)声明为finalstatic final

的字段

ii)我从活动A传递到活动B的意图及其数据

iii)在应用程序运行期间更改方向时onSavedInstanceState

我问这个是因为我想确保我的应用程序在很长一段时间后从后台恢复活动B时不会崩溃。

4 个答案:

答案 0 :(得分:2)

加载类时,无法为垃圾回收选择静态变量。当相应的类加载器(负责加载此类)本身被收集用于垃圾时,可以收集它们。 (see this answer

除此之外,如果您正确设计应用程序并且不自行保留活动,碎片等的引用,那么每个instace变量的对象都可以是gc。但是不要担心Android生命周期会为你解决这个问题,它会提供一个被破坏的活动/ gc与您保存在onSavedInstanceState onCreate()上的你的bundle等等,所以你可以检索那个状态你在去背景之前已经有了

答案 1 :(得分:1)

我认为您将垃圾收集的概念与Android提供的组件生命周期混淆。

垃圾收集只会释放位于内存中的对象(如果它们不再可访问),即不再存在对它们的强引用。如果您正在使用终结器来在收集对象时触发行为,那么您就是在做错事。

同时,组件生命周期由Android OS以确定的方式管理 - 当它希望杀死一个活动(或服务或应用程序)时,它将调用该组件上的一些方法(例如onDestroy())就是这样 - 一旦Android摧毁它,那么它应该从你的角度消失。

当您希望开始保存和恢复活动状态时,唯一的困难就出现了 - 当您的活动暂停/停止/销毁时,管理一些事情变得很重要。同样,这些是完全确定的事件,与垃圾收集无关。

具体回答您的问题:

i)声明字段的方式并不重要。如果你有一个对象的引用,那么你自动引用它的所有字段,这意味着它们不会被垃圾收集。

ii)当您创建意图时,是否保留对它的引用?如果没有,那么它可能是垃圾收集,但这不应该打扰你,因为你还没有引用它:)

iii)保存的实例状态将由Android系统保存,并在重新创建活动时返回给您。你不应该保留自己的参考。

希望有所帮助!

答案 2 :(得分:0)

从后台恢复时,您的活动可以被垃圾收集并重新创建。如果要保存某些数据,请使用SharedPreferences或其他持久存储。

答案 3 :(得分:0)

该线程很旧,但是没有解决https://developer.android.com/topic/performance/memory#release

中非常重要的一点。
  

Android可以通过多种方式从您的应用中回收内存或杀死您的应用   必要时完全使用应用程序来释放关键任务的内存

随时

杀死您的应用程序进程意味着它将重新启动,这意味着如果您尚未将任何状态保存到bundle,db或sharedprefs中,则会将其重新初始化。也有ComponentCallbacks2接口回调来侦听内存不足事件。