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

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

阅读更多

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

不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在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变量等等。

分享到:
评论

相关推荐

    IOS官方标准_单例模式

    3. **内存泄漏**:如果单例对象持有其他对象的强引用,可能导致这些对象无法释放,从而引起内存泄漏。 在实际开发中,我们需要根据具体需求和场景谨慎选择是否使用单例模式。例如,对于需要在整个应用生命周期内只...

    设计模式 For iOS-02-单例模式

    在使用单例时,开发者应当谨慎考虑是否真的需要单例模式,因为单例模式虽然有其优点,比如方便管理和访问全局状态,但也有潜在的缺点,比如不利于单元测试,以及可能引起循环引用等问题。单例模式最适用于那些真正...

    Singleton 单例模式的介绍以及解析

    此外,如果单例类需要持有对其他对象的引用,可能会引起内存泄漏问题,尤其是在长时间运行的应用中。 在实际开发中,我们需要根据项目需求和场景选择合适的单例实现方式。例如,如果应用对启动速度要求较高,可以...

    C++内存泄露的文档和代码

    在单例模式下,如果对象的生命周期管理不当,也可能导致内存泄露。比如,在类的静态成员变量中保存一个指针,并且这个指针分配了内存但没有正确释放,就会造成内存泄露。 ```cpp uchar* g_lpszFileName = NULL; ...

    Android开发最常见的5大内存泄漏

    总结来说,Android开发者应时刻警惕内存泄漏,通过合理使用静态变量、单例模式、BroadcastReceiver、Service、内部类以及Bitmap对象,避免不必要的内存占用,提高应用的性能和稳定性。同时,不断学习和掌握内存分析...

    android内存泄露的检测和排查

    5. **使用弱引用**:在可能引起内存泄漏的地方,比如自定义View、Adapter等,可以使用WeakHashMap来存储对对象的引用,这样当对象不再被其他地方引用时,会自动回收。 接下来,我们通过一个锁屏内存泄漏的例子来...

    Flex 应用内存泄露的分析与诊断

    例如,全局变量、静态变量和单例模式创建的对象容易导致内存泄露,因为它们的生命周期较长,可能会持续引用不再使用的对象。此外,当对象作为参数传递给方法并在方法内部创建新的引用,如果没有正确地解除引用,也会...

    android系统分析内存泄露测试

    垃圾回收机制会自动清理不再使用的对象,但当一个对象被静态变量、单例模式或者非静态内部类的匿名内部类引用时,垃圾回收器就无法识别这些对象是否还在使用,从而导致内存泄漏。 首先,我们需要了解Android的内存...

    避免 Android中Context引起的内存泄露

    本文将深入探讨由Context引起的内存泄露问题,特别是Activity和Drawable相关的内存泄露,以及单例模式下的内存管理。 首先,我们来理解一下Activity和内存泄露的关系。Activity是Android应用中的主要组件,用于展示...

    JAVA内存泄漏

    单例模式下的内存泄漏 - **场景**:单例模式如果持有对其他对象的引用,可能会导致这些对象无法被垃圾回收。 - **解决方法**: - 谨慎使用单例模式,并注意其持有的引用是否必要。 - 对于不再需要的引用,及时设...

    内存泄露从入门到精通三部曲之常见原因与用户实践1

    3. 使用WeakReference或SoftReference管理可能引起内存泄露的对象。 4. 注意线程的生命周期管理,避免长时间运行的任务。 5. 对于回调接口,添加和移除操作要平衡,避免只add不remove。 6. 在退出页面或组件时,确保...

    常见的内存泄漏原因及解决方法 - 简书1

    1. 单例模式引起的内存泄漏 单例模式是一种常用的创建对象的方式,确保一个类只有一个实例并提供全局访问点。然而,如果单例持有长时间存在的引用,比如Activity或Context,可能导致内存泄漏。例如,当单例中存储了...

    flex内存泄露(转载)

    - 对象自身的方法调用中,方法内部创建对`this`关键字的引用未正确释放,同样可能引起内存泄露(清单3)。 #### 防止Flex内存泄露的最佳实践 - **定期审查代码:** 定期检查代码中是否存在不必要的对象引用。 - **...

    android内存泄露

    2. 单例模式:单例的生命周期同样贯穿应用始终,如果单例中持有Activity或其他易泄漏的对象,可能导致内存泄露。 3. 匿名内部类:匿名内部类可能会隐式持有对外部类的引用,如果外部类是Activity或其他非静态上下文...

    Android开发最常见的5大内存泄漏.docx

    单例模式在Android中广泛使用,但由于其静态特性,可能导致内存泄漏。如果单例持有Activity的Context,而这个Context没有正确处理,就会造成泄漏。解决方法是改用Application的Context或者使用...

    Android内存优化——常见内存泄露及优化方案

    1. 使用弱引用(WeakReference/SoftReference):对于可能引起内存泄露的对象,可考虑使用弱引用或软引用,以便在内存不足时自动回收。 2. 避免在静态变量或单例中持有Context:尽量使用Application Context,而不是...

    浅谈内存泄漏

    3. **不正确的单例模式实现**:在单例类中,若对象创建和销毁的控制不严格,也容易引发内存泄漏。例如: ```cpp char* g_lpszFileName = NULL; void SetFileName(const char* lpcszFileName){ if(g_...

    单利模式例子

    然而,单例模式也有一些缺点,比如它违背了单一职责原则,可能导致代码难以测试,而且如果程序设计不当,可能会引起内存泄漏问题。 在实际开发中,要谨慎使用单例模式,尤其是在多线程环境下,需要考虑线程安全问题...

    Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    5. 代码审查:定期审查代码,查找可能引起内存泄漏的模式和习惯。 6. 使用Java 9及更高版本的强引用(Strong Reference)跟踪工具:Java 9引入了`-XX:+TraceReferences`和`-XX:+TraceReferenceGC`选项,可以追踪强...

    5.初级面试专题(中小厂).docx

    4. 单例模式引起的内存泄漏 解决方法包括: 1. 使用 Context 是 ApplicationContext,可以避免内存泄漏 2. 注册/反注册未成对使用引起的内存泄漏 3. 集合对象没有及时清理引起的内存泄漏 4. 使用内存分析工具来...

Global site tag (gtag.js) - Google Analytics