`

java中会存在内存泄漏吗,请简单描述。 .

    博客分类:
  • java
 
阅读更多

会。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加载dll,导致Java进程内存泄露

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

    JAVA内存泄漏分析工具

    Java内存泄漏分析是一个关键的系统优化任务,尤其是在大型企业级应用中,长期运行的系统可能会因为内存泄漏导致性能下降甚至服务中断。"JAVA内存泄漏分析工具"正是一款用于解决此类问题的专业工具,它能帮助开发者...

    java内存分配 内存泄漏

    然而,如果程序中存在对不再使用对象的引用,垃圾收集器可能无法识别这些对象,从而导致内存泄漏。 Java 文件的编译过程是从源代码(.java文件)通过javac编译器转换为字节码(.class文件),这个字节码是平台无关...

    ibm HeapAnalyzer java内存分析工具 ha457.jar

    IBM HeapAnalyzer是一款强大的Java内存分析工具,主要用于诊断和解决Java应用程序中的内存泄漏问题。这款工具通过对Java堆内存的深入分析,帮助开发者定位那些占用过多内存的对象,从而优化应用性能。在Java开发过程...

    Java内存监视器.rar

    Java内存监视是优化Java应用程序性能的关键环节,尤其是在大型企业级应用中,理解并管理内存的使用对于避免内存泄漏和提高程序效率至关重要。本资源“Java内存监视器.rar”提供了一个实用工具,帮助开发者实时监测...

    Java内存模型详解JMM.docx

    Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种内存模型,它描述了程序中各个变量之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节。JMM允许编译器和缓存...

    kettle内存溢出(Java heap space)以及解决方法.docx

    5. **代码优化**:检查并优化Kettle的自定义脚本或Java代码,避免无用的对象创建和内存泄漏。 6. **定期清理和释放资源**:确保Kettle在处理完数据后,及时释放不再使用的对象和资源,避免内存碎片。 最后,监控...

    Java内存模型描述及变量运用分析.pdf

    Java内存模型是Java程序运行的基础,它规定了Java中数据在内存中的存储和访问规则。在Java内存模型中,堆内存和栈内存是两个核心概念。堆内存主要存放对象的实例,所有通过new创建的对象都会在堆内存中分配空间。而...

    java实现内存动态分配

    Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    2. **内存泄露**:程序中存在不再使用的对象,但由于某些原因这些对象没有被垃圾回收器回收。 3. **大数据处理**:应用处理的数据量过大,超过了当前JVM配置所能提供的内存大小。 **解决方案:** 1. **增加堆内存...

    Mem.rar_内存泄露

    内存泄露通常发生在动态内存分配的环境中,如C++、C#或Java等语言。在这些语言中,程序员需要手动管理内存,如果不正确地处理内存分配和释放,就会发生内存泄露。当一个程序不再需要一块内存但没有将其归还给系统,...

    java内存模型.pdf

    标题和描述中提及的知识点主要围绕Java内存模型(JMM),JVM内存结构,包括堆栈讲解,以及本机内存管理等内容。以下是对这些知识点的详细阐述: ### Java内存模型(JMM) #### JMM简介 Java内存模型(JMM)是Java虚拟机...

    用JAVA做的虚拟内存管理.rar,JDK是6.2

    9. **JNI(Java Native Interface)**:在描述中提到的jar打包成exe的工具可能使用了JNI技术,允许Java代码调用C/C++等本地库,这可能涉及到跨语言内存管理,需要注意内存泄漏问题。 10. **内存优化**:对于大型...

    Android应用程序内存泄漏的分析.pdf

    标题中提到的是关于“Android应用程序内存泄漏的分析”,这意味着文档的核心内容将集中在分析Android平台下应用程序可能遇到的内存泄漏问题。内存泄漏是Android开发中非常常见且棘手的问题,它发生在一个对象不再被...

    转一篇有关Java的内存泄露的文章

    Java内存泄露是一个重要的主题,它关乎程序的性能和稳定性。内存泄露是指程序中已经不再使用的对象,由于某些原因无法被垃圾收集器(Garbage Collector)回收,从而导致系统内存持续占用,随着时间推移可能导致系统...

    Java内存模型分析与其在编程中的应用.pdf

    Java内存模型是Java平台的核心概念之一,它定义了Java程序中各种变量的访问规则以及如何在运行时分配内存区域给对象。Java内存模型的深入分析对于编写高性能的Java应用程序至关重要,本文将详细探讨Java内存模型的...

    Android_内存泄漏研究及调试.doc )

    #### 二、Android (Java) 中常见的容易引起内存泄漏的不良代码 在Android应用开发中,不当的内存管理可能导致内存泄漏。下面列举了一些常见的内存使用不当的情况: ##### (一) 查询数据库没有关闭游标 **描述**:...

    自动化测试在测试内存泄露中的应用

    内存泄露的存在可能会导致软件在运行过程中逐渐消耗越来越多的系统资源,最终可能导致系统崩溃或响应速度大幅下降。因此,如何有效地测试并定位内存泄露成为软件测试过程中的一个重要环节。 #### 二、计算机内存及...

Global site tag (gtag.js) - Google Analytics