【问题标题】:Can a Java Singleton object be garbage collected only in part?Java Singleton 对象可以仅部分被垃圾收集吗?
【发布时间】:2021-07-30 14:20:28
【问题描述】:

据我所知,Java 单例对象不能被垃圾回收,除非加载此类(类加载器)的上下文本身符合垃圾回收条件。

问题 #1: 是这样吗,还是有其他可能被垃圾收集的情况?

在我的应用程序中,我有一个创建单例对象的 Android 活动。当我的应用程序在后台运行时设备内存不足时,如果我尝试打开它并将其带回前台,我会看到单例对象已被销毁并重新初始化。

问题 #2: 如果必须释放内存并且对单例对象进行垃圾回收,是否存在单例对象可能无法完全进行垃圾回收而仅对其部分静态变量进行垃圾回收的情况?

【问题讨论】:

  • 你有一个创建单例的活动是什么意思?
  • 可能更容易分享Activity和“singleton”代码。
  • @MikkelT 我的意思是,例如在我的主要活动的 onCreate 函数中,我创建并初始化了一个单例对象的实例。

标签: java android memory garbage-collection singleton


【解决方案1】:

在我的应用程序中,我有一个创建单例对象的 Android 活动。当我的应用程序在后台运行时设备内存不足时,如果我尝试打开它并将其带回前台,我会看到单例对象已被销毁并重新初始化。

是的。这与“垃圾收集”有关。那是 android 卸载你的整个应用程序,这是非常不同的。

如果必须释放内存并且对单例对象进行垃圾回收,是否存在单例对象可能无法完全进行垃圾回收而仅对其部分静态变量进行垃圾回收的情况?

因此,这个问题主要是不合逻辑的。

有两种完全不同的机制在起作用:

  1. 有一些空闲的 CPU 周期和/或一些内存压力,所以做一些垃圾收集。你不会注意到任何这些 - 如果你可以在源代码中看到它,它就不会被垃圾收集。

  2. 这还不够好 / 正在设备上启动一个不同的进程,并且垃圾收集正在运行的进程没有滚雪球的机会来释放足够的空间。在这种情况下,您的整个 android 应用程序会直接卸载。你被狠狠地杀死了,下一次你的应用程序引起注意(用户运行它,或者你有一些触发的钩子),你的应用程序从头开始重新加载。

因此没有半卸载。无论垃圾收集器做什么,根据定义都是不可观察的(如果它已经被收集,它就不会被收集),如果你的应用程序被卸载,整个事情就会消失。

【讨论】:

  • 另外值得补充的是,如果您创建了单例实例并且您的应用程序引用了它,那么无论如何它都没有资格进行垃圾收集。如果对象不再被其他任何东西引用,GC 只会从堆中删除对象。它需要无法访问才能有资格收集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多