`
wsyandy
  • 浏览: 38916 次
  • 来自: ...
社区版块
存档分类
最新评论

单例模式容易引起内存泄露

阅读更多

单例模式容易引起内存泄露

不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露,考虑下面的例子:

Java代码 复制代码
  1. class A{   
  2.     public A(){   
  3.            B.getInstance().setA(this);   
  4.    }   
  5.    ....   
  6. }  
class A{
    public A(){
           B.getInstance().setA(this);
   }
   ....
}


//B类采用单例模式

Java代码 复制代码
  1. class B{   
  2.      private A a;   
  3.      private static B instance=new B();   
  4.      public B(){}   
  5.      public static B getInstance(){   
  6.          return instance;   
  7.     }   
  8.     public void setA(A a){   
  9.           this.a=a;   
  10.     }   
  11.    //getter...   
  12. }  
class B{
     private A a;
     private static B instance=new B();
     public B(){}
     public static B getInstance(){
         return instance;
    }
    public void setA(A a){
          this.a=a;
    }
   //getter...
}



显然B采用singleton模式,他持有一个A对象的引用,而这个A类的对象将不能被回收。想象下如果A是个比较大的对象或者集合类型会发生什么情况。

    上面所讲的这些也启发我们如何去查找内存泄露问题,第一选择当然是利用工具,比如jprofiler,第二就是在代码复审的时候关注长生命周期对象:全局性的集合、单例模式的使用、类的static变量等等。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics