活动持有参考Singleton泄漏内存?

时间:2013-05-24 13:27:27

标签: java android

如果我有这样的代码:

public class MyActivity extends Activity 
{

private SingletonClass singletonInstance;

...

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    singletonInstance = SingletonClass.getInstance();
}

...
}

我的理解是,Activity将保持活动状态,因为它具有对静态实例的引用,因此无法进行GC。但是,它似乎并没有给我的应用程序带来任何问题。我不理解GC或者这是否真的泄漏了内存,我应该避免保留对我的单例类的引用?

2 个答案:

答案 0 :(得分:1)

研究了你的疑问,我确认了答案:

如果您将singletonInstance声明为static,则会发生这种情况。对于您的Activity,singletonInstance只是SingletonClass的一个实例。请记住,没有“静态实例”这样的东西,实例只是给定类的一个对象,使它静态的是你在范围中声明它的方式。对于MyActivity,singletonInstance不是静态的,即使在SingletonClass中你引用同一个对象/实例,它也被声明为静态。

这样,GC可以清除您的活动而不会出现问题。我在Android上有一个类似的实现,它涉及一个服务,它运行了几百个小时没有任何内存或性能问题......

此致

答案 1 :(得分:1)

我一直在使用Square的LeakCanary来检测我的Android应用中的内存泄漏,并且由于静态单例obj所持有的引用而在我的一个Activity上检测到泄漏。

My Activity与Q中的结构相同,其中Activity引用了单例Presenter类,但引用不是静态的。

public MyActivity extends Activity {
  private MyPresenter mPresenter;
  ...
  onCreate() {
     mPresenter = MyPresenter.getInstance()
     ...
  }
}
..
public class MyPresenter { // Different class
 private static MyPresenter mInstance;
... singleton code ...
}

我读了这个链接,我觉得这很有道理。 http://www.javaworld.com/article/2071737/core-java/plug-memory-leaks-in-enterprise-java-applications.html

  

一旦Singleton类被实例化,它将保留在内存中以用于应用程序的生命周期。其他对象也会有一个实时引用,因此永远不会被垃圾回收。

     

建议: - 避免从持久对象引用对象。如果无法避免这种用法,请使用弱引用,这种引用不会阻止对象被垃圾回收。