java - Android VM 是否可以在不终止整个 Android 应用程序的情况下垃圾收集静态变量?

标签 java android static garbage-collection dalvik

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

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

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

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

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

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

最佳答案

If I set "userid" variable to some value duing Android application lifecycle, say Global.userid = "myid", is it possible for this variable to become null while Android application is still alive?

如果您自己将其设置为 null,是的。

In other words, is it possible for Android VM to unload Global class and "kill" this global static variable due to low-memory issue without killing the whole Android application?

对于正常情况,没有。

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

I am worried about the situation that userid becomes suddenly null while application is running (due to low memory issue), therefore crashing the whole app.

这不应该发生。

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

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

关于java - Android VM 是否可以在不终止整个 Android 应用程序的情况下垃圾收集静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19824691/

相关文章:

java - 将 java 应用程序注册为 Windows 10 中的默认浏览器

java - 无法关闭JposLogger的文件

java - 打开/关闭给定网络的飞行模式。

python扩展模块初始化 - 多个文件

java - 如何在测试方法中使用@Autowired

android - 调整网页以适应任何设备

android - 在不使用 GPS 的情况下查找手机的当前位置

Python:即使以不同方式导入模块,也使类变量成为静态变量

javascript - 如何访问 AS3 或 JavaScript 中类的静态成员的名称

java - 具有一对多关系的比较器