Android VM是否有可能在不杀死整个Android应用程序的情况下垃圾收集静态变量?

时间:2013-11-06 23:03:15

标签: java android static garbage-collection dalvik

(标题是误导性的,因为垃圾收集器只收集对象,但我发现这个标题更直接)

假设我在名为Global的类中有一个名为“userid”的静态变量的Android应用程序(在初始化时为null)。

如果我将“userid”变量设置为Android应用程序生命周期的某个值,比如Global.userid =“myid”,那么当Android应用程序还活着时,此变量是否可能变为空?

换句话说,Android VM是否有可能卸载Global类并由于低内存问题而“杀死”这个全局静态变量而不会杀死整个Android应用程序?

我担心在应用程序运行时userid突然变为null(由于内存不足问题),因此崩溃了整个应用程序。

修改的 我误解了一些概念(在申请流程与活动之间)。谢谢你的所有答案!

2 个答案:

答案 0 :(得分:21)

  

如果我将“userid”变量设置为Android应用程序生命周期的某个值,比如Global.userid =“myid”,那么当Android应用程序还活着时,此变量是否可能变为空?

如果你自己设置为null,是的。

  

换句话说,Android VM是否有可能卸载Global类并由于低内存问题而“杀死”这个全局静态变量而不会杀死整个Android应用程序?

正常情况下,没有。

如果您使用自定义类加载器,可以想象可能存在类卸载的情况(因此其上的任何静态数据成员都 poof ) - 我似乎记得那里是关于这种情况的讨论,但我忘记了结论。但是,非常很少有应用程序应该搞乱自定义类加载器。

  

我担心在应用程序运行时userid突然变为null(由于内存不足问题),因此崩溃了整个应用程序。

这不应该发生。

可以发生的是用户在您的应用中,通过HOME(或通知,来电或最近任务列表等)离开应用,然后通过recent-tasks列表返回到您的应用。如果您的进程在不在前台期间终止,则当您从最近任务列表启动活动时,您的静态数据成员将为null。由于用户返回的活动可能不一定是您的启动器活动,因此您的应用可能会像静态数据成员自发转为null一样,即使这是因为您的流程已终止并重新启动。

这是静态数据成员需要非常小心地使用 的几个原因之一。

答案 1 :(得分:1)

如果您将变量设置为静态,那么您可以从应用中的任何位置访问它,而无需每当我认为这是Singleton pattern的良好候选者时创建该类的新实例。

String userid = Global.getInstance().userid;