【问题标题】:Can a wrapper variable within a Singleton object get garbage collected while Singleton is not null?当 Singleton 不为空时,Singleton 对象中的包装器变量是否可以被垃圾收集?
【发布时间】:2020-11-15 18:12:18
【问题描述】:

在这个Singleton 实例中,这个private Long severDate 是否可以在singleton 实例仍然不为null 的情况下被垃圾回收?

我在 Android 应用程序中遇到了这种情况。想知道 Android 操作系统以某种方式释放未使用的单个内存值。

public class DataHolder {

    private static DataHolder self;

    private Long severDate; 
    private int numb;

    public static synchronized DataHolder getInstance() {
            if (self == null) {
                self = new DataHolder();
            }
            return self;
    }
 
}

【问题讨论】:

  • 由于DataHolder 的实例保留的内存包含对Long 对象的引用,因此在分配给self 的内存释放之前,引用的内存无法释放。跨度>
  • 这就是整个代码? serverDate从未被使用过吗?
  • @aminography 与其他变量相比,这个 Long 值很少使用。有时,用户可以让 Android 应用程序进入后台约 1/2 小时,然后再次使用它。我怀疑在那段时间可能整个 DataHolder 对象可能会被垃圾收集。但是,我仍然无法证明这一点。只是想知道Android内存优化是否可以在此之前从单个变量中释放内存。
  • @Eugene 没用过,只有在用户下单的时候才会用到。但是 DataHolder 引用在应用程序的任何地方都被使用。只有这个 serverDate 的 getter 可能不会经常使用。另外,根据逻辑,在初始赋值后,这个值是不可能得到空值的,我再也没有修改过这个值。我已经确认过了。
  • 垃圾收集和杀死(和重新启动)应用程序是有区别的。在后一种情况下,该字段将为null,因为您没有为其值实现持久性(其初始值为null)。

标签: java android null garbage-collection wrapper


【解决方案1】:

在 "Long severDate" 引用它之前,GC 不会删除它。现在这一切都取决于你是否在某些类中创建了这个单例类的实例。 P.S:在android中确保你在onCreate方法中创建了这个类的obj。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多