据我所知,Java单例对象不能被垃圾收集,除非加载该类的上下文(类装入器)本身符合垃圾收集条件。
问题# 1:这是对的吗?或者是否存在另一种情况,它可能是垃圾收集?
在我的应用程序中,我有一个Android活动创建一个单例对象。当设备内存不足,而我的应用程序在后台,如果我试图打开它,并把它带回前台,我看到单例对象已被销毁,并重新初始化。
问题# 2:如果必须释放内存并且单例对象被垃圾收集,是否存在单例对象可能不会完全被垃圾收集,而只是它的一些静态变量将被垃圾收集的情况?
在我的应用程序中,我有一个Android活动创建一个单例对象。当设备内存不足,而我的应用程序在后台,如果我试图打开它,并把它带回前台,我看到单例对象已被销毁,并重新初始化。
是的。这与"垃圾收集"没有任何关系。这是android卸载你的整个应用,这是非常不同的。
如果必须释放内存并且单例对象被垃圾收集,是否存在单例对象可能不会完全被垃圾收集而只是其一些静态变量将被垃圾收集的情况?
因此,这个问题基本上是一个非推论。
有两种完全不同的机制在起作用:
-
有一些空闲的CPU周期和/或一些内存压力,所以做一些垃圾收集。你不会注意到这些——如果你能在源代码中看到它,它不会被垃圾收集。
-
这还不够好/设备上正在启动一个不同的进程,垃圾收集正在运行的进程没有机会释放足够的空间。在这种情况下,你的整个android应用程序被直接卸载。你被硬杀了,下次你的应用引起注意(用户运行它,或者你有一些钩子触发),你的应用就会重新加载,从头开始。
因此没有半卸载。根据定义,垃圾收集器所做的任何事情都是不可观察的(如果它是不可观察的,它就不会被收集),如果你的应用程序被卸载,整个事情就会消失。