Java Android虚拟机是否可以在不杀死整个Android应用程序的情况下对静态变量进行垃圾收集?
(这个标题有误导性,因为垃圾收集器只收集对象,但我发现这个标题更简单) 假设我有一个Android应用程序,在一个名为Global的类中有一个名为“userid”的静态变量(初始化时为null) 如果我在Android应用程序生命周期中将“userid”变量设置为某个值,比如Global.userid=“myid”,那么当Android应用程序仍处于活动状态时,该变量是否可能变为null 换句话说,Android虚拟机是否可能卸载全局类并“杀死”这个全局静态变量(由于内存不足),而不杀死整个Android应用程序 我担心在应用程序运行时,userid突然变为null(由于内存不足),从而导致整个应用程序崩溃 编辑 我误解了一些概念(在申请过程和活动之间)。谢谢你的回答 如果我在Android应用程序生命周期中将“userid”变量设置为某个值,比如Global.userid=“myid”,那么当Android应用程序仍处于活动状态时,该变量是否可能变为null 如果您自己将其设置为Java Android虚拟机是否可以在不杀死整个Android应用程序的情况下对静态变量进行垃圾收集?,java,android,static,garbage-collection,dalvik,Java,Android,Static,Garbage Collection,Dalvik,(这个标题有误导性,因为垃圾收集器只收集对象,但我发现这个标题更简单) 假设我有一个Android应用程序,在一个名为Global的类中有一个名为“userid”的静态变量(初始化时为null) 如果我在Android应用程序生命周期中将“userid”变量设置为某个值,比如Global.userid=“myid”,那么当Android应用程序仍处于活动状态时,该变量是否可能变为null 换句话说,Android虚拟机是否可能卸载全局类并“杀死”这个全局静态变量(由于内存不足),而不杀死整个An
null
,则是
换句话说,Android虚拟机是否可能卸载全局类并“杀死”这个全局静态变量(由于内存不足),而不杀死整个Android应用程序
正常情况下,不会
如果您使用自定义类加载器,可以想象可能会出现类被卸载的场景(因此,类上的任何静态数据成员都会失效)——我似乎记得曾经讨论过这个场景,但我忘记了结论。然而,很少有应用程序会与自定义类加载器混为一谈
我担心在应用程序运行时,userid突然变为null(由于内存不足),从而导致整个应用程序崩溃
这不应该发生
可能发生的情况是,用户在您的应用程序中,通过主页(或通知、来电或最近的任务列表等)离开应用程序,然后通过最近的任务列表返回到您的应用程序。如果您的进程在不在前台的时间内终止,则当您的活动从最近的任务列表启动时,静态数据成员将为
null
。由于用户返回的活动不一定是您的启动程序活动,因此您的应用程序可能会表现为静态数据成员自动变为null
,即使这是因为您的进程已终止并重新启动
这是为什么需要非常小心地使用静态数据成员的几个原因之一。如果您将变量设置为静态,以便您可以从应用程序中的任何位置访问它,而无需每次创建新的类实例,我相信这是一个很好的应用程序候选
我认为Andriod不鼓励使用静态临时存储。我现在找不到那个链接。你为什么认为会发生这种情况?你有没有任何迹象表明它确实存在?绝对没有。您的整个应用程序都将被删除。但是,如果您出于某种原因转到另一个应用程序,您的应用程序可能会在您不太注意的情况下重新启动。“因为用户返回的活动不一定是您的启动器活动…”这是真的吗?你能确切地告诉我当应用程序从最近的任务列表重新运行时会发生什么吗?@SHH:“真的是这样吗?”--当然。“你能确切地告诉我当应用程序从最近的任务列表重新运行时会发生什么吗?”--Android将控制权返回到该任务的后堆栈顶部的任何活动。如果承载该活动的进程已经终止,Android会启动一个新的进程并创建该活动的一个新实例,然后再将控制权传递给该新实例。那么BackStack即使在应用程序终止后仍保持活动状态?您知道应用程序上下文是否也保持活动状态吗?@SHH:“因此,即使在应用程序终止后,backbackback也保持活动状态?”--后堆栈的表示形式“保持活动状态”。“您知道应用程序上下文是否也保持活动状态吗?”--仅当您的进程未终止时才知道。因此,即使android应用程序终止(从而释放所有使用的资源),应用程序进程也可能保持活动状态?(其中包含backbackback和其他信息?)
String userid = Global.getInstance().userid;