【问题标题】:Possible to free Context from Singleton in Android to prevent memory leak可以在 Android 中从 Singleton 中释放 Context 以防止内存泄漏
【发布时间】:2015-07-25 11:41:04
【问题描述】:

我正在维护一个遗留项目,由于限制,我无法进行太多重构。但我只是在以下情况下发现了可能的内存泄漏。

将片段传递给单例类

Foo.getInstance().setBar(fragment);

假设静态实例的寿命比我们需要的长,在该片段的 onDestroy() 方法中将其设为 null 是否是一种好方法。

@Override
public void onDestroy(){
    Foo.getInstance().setBar(null);//to prevent memory leak
    super.onDestroy();
}

我是内存泄漏领域的新手,如果有任何问题请纠正我:)

【问题讨论】:

    标签: android performance memory-leaks


    【解决方案1】:

    在单例中使用WeakReference

    【讨论】:

    • 您好,感谢您的回复。这是对单例模式中的所有变量进行弱引用还是仅对那些消耗大量内存的对象的常见做法。
    • 弱引用用于不应由引用对象拥有的对象,并且您希望引用对象的持续时间比拥有被引用对象的一个​​(或全部,如果有更多)长得多。对象有多大并不重要。有时很难区分何时是这种情况,但在这种情况下很明显:片段被其他人破坏,但单例仍然存在。顺便提一句。如果您可以使用任何上下文而不一定是片段,请使用应用程序上下文;那你就不用担心弱引用了。
    • 感谢您的建设性回答,非常有帮助。我还看到了带有 nullify 对象以释放内存的代码,这种方法可以用 Wea​​kReference 解决方案代替吗?还有其他需要考虑的问题吗?非常感谢!
    • @WenChao 也可以使用这种方法,但是当由于某种原因您没有预料到(例如异常)对象未为空时,您会冒内存泄漏的风险。另一方面,弱引用仅在 GC 收集对象时被清除,因此如果您需要保持准确的生命周期,null 可能是首选。或者您可以结合使用这两种方法。
    猜你喜欢
    • 2015-04-04
    • 2016-07-10
    • 2014-08-26
    • 2022-01-21
    • 2023-03-23
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多