`

java中会存在内存泄漏吗?

 
阅读更多

学习笔记,转自:http://blog.csdn.net/yakihappy/article/details/3979942

 

会。java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。

    1.集合类,集合类仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。这一点其实也不明确,这个集合类如果仅仅是局部变量,根本不会造成内存泄露,在方法栈退出后就没有引用了会被jvm正常回收。而如果这个集合类是全局性的变量(比如类中的静态属性,全局性的map等即有静态引用或final一直指向它),那么没有相应的删除机制,很可能导致集合所占用的内存只增不减,因此提供这样的删除机制或者定期清除策略非常必要。

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

  class A{

  public A(){

    B.getInstance().setA(this);

  }

  ....

  }

  //B类采用单例模式

  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是个比较大的对象或者集合类型会发生什么情况。

   上面所讲的这些也启发我们如何去查找内存泄露问题,在代码复审的时候关注长生命周期对象:全局性的集合、单例模式的使用、类的static变量等等Java的实现过程中,也要考虑其对象释放,最好的方法是在不使用某对象时,显式地将此对象赋空。最好遵循谁创建谁释放的原则。

 

分享到:
评论

相关推荐

    Java 中会存在内存泄漏吗1

    在Java编程语言中,虽然存在自动内存管理机制,即垃圾回收器(Garbage Collector, GC),它负责识别并清理不再使用的对象,以释放内存资源,但这并不意味着Java程序绝对不可能出现内存泄漏。实际上,在实际开发中,...

    Java加载dll,导致Java进程内存泄露

    描述中的“NULL”可能是博主在描述问题时的简化表示,通常在编程中“NULL”代表空指针,这可能暗示了在DLL的使用过程中存在空指针异常或者未初始化的指针问题,这也可能是引发内存泄露的原因之一。 标签“源码”和...

    java内存泄漏分析工具

    通过监视应用程序的内存使用情况,开发者可以观察到内存是否持续增长,进而怀疑是否存在内存泄漏。 另一个著名的工具是MAT (Memory Analyzer Tool),它是一款强大的Eclipse插件,专门用于分析HProf内存转储文件。...

    java内存分析-内存泄露问题.rar

    4. **定位代码问题**:根据引用链回溯到代码,找出导致内存泄漏的代码片段,可能是因为资源未关闭、静态集合类中添加了大量对象等原因。 5. **修复并验证**:修改代码,消除内存泄露,并重新运行程序验证是否解决...

    java使用JMAP定位代码内存泄漏在哪

    本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题。 首先,理解内存泄漏的概念:内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能并不明显,但随着时间的推移,这些未...

    java内存泄漏解决

    在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地理解和应对这一挑战。 #### 二、Java内存模型与内存区域 Java...

    Java内存泄露及内存无法回收解决方案

    4. Native内存泄漏:Java应用可能使用JNI(Java Native Interface)与C/C++代码交互,若C/C++部分存在内存泄漏,也会间接导致Java内存泄漏。 解决内存泄漏的方法主要包括: 1. 使用工具监控:通过工具如VisualVM、...

    java避免内存泄露

    然而,在实际应用中,仍然存在一些特殊情况会导致内存泄露的发生。 #### 二、内存泄露的原因分析 1. **未及时关闭资源**:例如文件句柄、数据库连接等,如果不主动关闭,即使不再使用,也会占用系统资源。 2. **...

    java内存泄漏问题追踪

    在Java编程中,内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,随着时间推移,系统可用内存逐渐减少,从而影响系统运行...

    java 内存泄漏

    在Java中,内存泄漏主要发生在Java堆内存中,其主要原因有: - **对象引用不再使用**:当一个对象不再被引用时,理论上应该被垃圾回收器回收。但如果存在对这个对象的“隐式”引用,使得垃圾回收器无法识别,那么这...

    基于Java的内存泄露分析及定位

    通过观察完全垃圾回收后的内存使用情况,如果内存持续上升,可能存在内存泄漏。 JVisualVM是Java开发者的有力工具,它可以提供内存消耗、线程状态、CPU使用等信息,并通过安装VisualGC插件来深入分析GC行为和内存...

    java垃圾回收及内存泄漏.pptx

    ### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:Java虚拟机管理的内存主要分为以下几个部分: - **方法区(Method Area)**:存储类的信息(如类名、字段、方法等)、常量、...

    Iframe内存泄露分析

    此外,还需要注意到项目中大量使用的 Ext 和 Jquery 框架本身存在内存泄漏的问题,需要常常深入到这些框架的源码,解决问题的难度自然提高。 检测内存泄漏的工具和手段确实有限,仅有的两个工具(JavaScript ...

    如何解决Java内存泄漏.pdf

    在Java中,内存泄漏通常是指不再使用的对象占用的内存无法被垃圾回收器回收。这种情况下,内存泄漏通常是由开发者编写代码时的不恰当行为导致的,比如:未能及时释放资源,持有不必要的对象引用等。 接下来,Java...

    关于java内存泄漏

    4. **ThreadLocal变量**:ThreadLocal中保存了对对象的强引用,如果线程长时间存活,而这些对象又不再被使用,则会导致内存泄漏。 #### 四、Java内存泄漏的检测与避免 ##### 检测方法: 1. **工具辅助**:使用...

    java内存泄露总结

    Java内存泄露问题是软件开发过程中常见的难题之一。通过对内存管理机制的理解及上述几种常见内存泄露场景的认识,开发者可以更好地预防和解决这类问题。为了进一步提高代码的质量,建议在开发过程中结合单元测试和...

    关于JAVA内存泄漏问题注意事项

    1. **理解可达性和无用性**:内存泄漏在Java中发生时,通常是由于某些对象尽管不再使用,但仍然可以通过对象引用图到达,这使得垃圾收集器无法识别它们为无用对象,从而导致它们占据内存空间。 2. **及时释放引用**...

    java内存分配 内存泄漏

    Java 内存分配和内存泄漏是Java编程中关键的概念,涉及到Java虚拟机(JVM)的工作原理和程序性能优化。 Java 内存分配主要发生在JVM的三个主要区域:堆(Heap)、栈(Stack)和方法区(Method Area)。堆是Java对象...

Global site tag (gtag.js) - Google Analytics