【问题标题】:Making static reference variable nullify will ever be garbage collected by java?使静态引用变量nullify会被java垃圾收集吗?
【发布时间】:2019-03-01 18:24:25
【问题描述】:

我有一个看起来很简单的问题,但我有点困惑。我的问题是,在 Android 应用程序中,我出于某些目的对活动进行静态引用。在 onDestroy() 中,我在显式分配空值时将该活动引用设为空。好吗?它是否有资格进行垃圾收集?它还会导致内存泄漏吗?请在这方面帮助我。

这是我在 onCreate() 方法中用于活动参考的代码

mInstance = this;

这就是我在 onDestroy() 中分配空值的方式

 @Override
protected void onDestroy() {
    super.onDestroy();
    mInstance = null;
}

【问题讨论】:

  • 不要做静态活动参考。没有充分的理由拥有这样的 Activity 的静态副本。如果你认为你需要它,那么你就是在错误地构建你的应用程序。请记住,任何时候都可能存在 Activity 的多个副本,因此这种技术将无法正常工作。
  • 是的,你是对的。我100%同意。我得到了代码,我在许多活动中发现了许多时间活动静态引用。我的问题是,如果我在 ondestroy 方法中为引用分配 null 值,它是否有资格进行垃圾回收?
  • 如果没有从垃圾回收根对象到变量的路径,则对象符合回收条件。因此,对某物进行静态引用会使其无法识别,因为静态变量是 gc 根。将其设置为 null 将消除无法识别的单一原因,但仍可能因其他原因无法识别。

标签: java android


【解决方案1】:

我不是 Android 开发人员,所以我会在不考虑这一点的情况下回答您的问题。

是的,你的Activity 在堆中分配的空间将被收集(可能被收集)一旦不再存在对它的引用。就像 Java 中的所有其他对象一样。

是否成为static 并不会改变这一点。


虽然老实说我不明白为什么

mInstance = this;

你能详细解释一下吗?
这根本不是线程安全的,所以如果您在并发环境中工作,请小心。

【讨论】:

  • mInstance 基本上是活动的引用...你可以将活动视为 java 中的类
  • @AnonymounslyDone 我知道,我知道。我明白你在做什么。我编辑了答案。
【解决方案2】:

是的,如果您将其取消,它将被垃圾回收,但将 Activity 分配给静态变量是一种反模式,必须不惜一切代价避免,即使您最终将其取消,因为这是泄露 Activity 的最简单方法。

事实上,Android Studio 应该已经给你一个警告了。

这里有一些literature 以避免内存泄漏。

【讨论】:

  • 您的回答增加了一些有价值的建议。谢谢你指引我正确的方向。
【解决方案3】:

人们会因此而讨厌我,但在我自己的模块化架构中,我喜欢在 android 上使用它们。是的,如果你没有正确使用它们,那就是内存泄漏,但它可以节省时间,而且时间在我的书中意味着 $$$。当我需要将 Java 对象从一个活动解析到另一个活动时,有不同的选项。 putExtra(JsonString)、putExtra(Parseable)、putExtra(Serializable)。但我只是想创建一个新的静态文件来保存我需要的所有临时对象,并使用静态公共函数在其他活动中获取它们后将它们全部无效。这样做时要小心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多