【问题标题】:is it possible for Android VM to garbage collect static variables without killing the whole Android application?Android VM是否可以在不杀死整个Android应用程序的情况下垃圾收集静态变量?
【发布时间】:2013-11-18 10:25:32
【问题描述】:

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

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

如果我在 Android 应用程序生命周期中将“userid”变量设置为某个值,例如 Global.userid = “myid”,那么当 Android 应用程序仍然存在时,该变量是否可能变为 null?

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

我担心在应用程序运行时用户 ID 突然变为空的情况(由于内存不足的问题),从而导致整个应用程序崩溃。

编辑 我误解了一些概念(在应用程序流程与活动之间)。谢谢大家的回答!

【问题讨论】:

  • 我认为静态存储在 Andriod 中是不鼓励的。我找不到那个链接。
  • 您认为为什么会发生这种情况?你有任何迹象表明它确实如此吗?
  • 绝对不是。您的整个应用程序将不得不被杀死。但是,如果您出于某种原因转到另一个应用程序,您的应用程序可能会在您没有引起注意的情况下重新启动。

标签: java android static garbage-collection dalvik


【解决方案1】:

如果我在 Android 应用程序生命周期中将“userid”变量设置为某个值,例如 Global.userid = “myid”,那么当 Android 应用程序仍然存在时,该变量是否可能变为 null?

如果您自己将其设置为null,则可以。

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

对于正常情况,没有。

如果您使用自定义类加载器,可以想象在某些情况下类会被卸载(因此它们上的任何静态数据成员都会poof)——我似乎记得那里正在讨论这种情况,但我忘记了结论。但是,非常很少有应用会使用自定义类加载器。

我担心在应用程序运行时用户 ID 突然变为空的情况(由于内存不足的问题),从而导致整个应用程序崩溃。

那不应该发生。

可能发生的情况是用户在您的应用程序中,通过 HOME(或通知、来电或最近任务列表等)离开应用程序,然后稍后通过最近的任务列表返回到您的应用程序。如果您的进程在它不在前台的时间内被终止,那么当您的活动从最近的任务列表启动时,您的静态数据成员将是null。由于用户返回的活动不一定是您的启动器活动,因此您的应用可能会表现得好像静态数据成员自发转为null,即使这是因为您的进程已被终止并重新启动。

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

【讨论】:

  • “由于用户返回的活动不一定是您的启动器活动......”这真的是真实的情况吗?你能告诉我当应用程序从最近的任务列表中重新运行时会发生什么吗?
  • @SHH:“这是真的吗?” - 当然。 “你能告诉我当应用程序从最近的任务列表中重新运行时会发生什么吗?” -- Android 将控制权返回到该任务的后台堆栈顶部的任何活动。如果托管该 Activity 的进程已终止,Android 会启动一个新进程并创建该 Activity 的一个新实例,然后再将控制权传递给该新实例。
  • 所以即使应用程序终止,BackStack 仍然存在?你知道应用上下文是否也保持活跃吗?
  • @SHH:“所以即使应用程序终止,BackStack 仍然存在?” - 后堆栈“保持活跃”的表示。 “你知道应用程序上下文是否也保持活跃吗?” -- 仅当您的进程未终止时。
  • 那么,即使android应用程序终止(从而释放所有使用的资源),应用程序进程可能仍然活着? (其中包含backstack和其他信息?)
【解决方案2】:

如果您将变量设为静态,以便您可以从应用程序中的任何位置访问它,而无需每次都创建该类的新实例,我认为这是 Singleton pattern 的一个很好的候选者。

String userid = Global.getInstance().userid;

【讨论】:

  • 这对主题有何重要意义?我真的不喜欢单例,因为它更多是为了零利益而写作。我看不出 Global.getInstance().userid 比 Global.userid 有什么优势。只有当你有一堆不同的数据能够快速重置它或者你真的需要 getter 和 setter 时,Singleton 才很酷。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
相关资源
最近更新 更多