`

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

    博客分类:
  • java
 
阅读更多

 

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

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

    JAVA内存泄漏分析工具

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

    java内存分配 内存泄漏

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

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

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

    java实现内存动态分配

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

    Java内存模型详解JMM.docx

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

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

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

    深入理解Java内存模型 pdf 超清版

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了程序中各个线程如何访问和修改共享变量,以及如何确保数据的一致性。深入理解Java内存模型对于编写高效的并发程序至关重要。本文...

    java内存分配描述

    Java内存分配是Java编程中非常关键的概念,它关乎程序的性能和稳定性。Java内存主要分为以下几个部分: 1. **寄存器**:这是最快的存储区域,由编译器根据需求进行分配,通常由硬件直接支持,程序员无法直接控制。 ...

    ThreadLocal 内存泄露的实例分析1

    然而,如果存在对 WebappClassLoader 的强引用,那么这个类加载器就无法被回收,进而导致了内存泄漏。 在描述的案例中,`LeakingServlet` 是一个使用了 `ThreadLocal` 的 Servlet。`ThreadLocal` 是 Java 中用于在...

    JVM内存泄露解决之道

    ### JVM内存泄露解决之道 #### 背景与概述 在IT系统运维和技术开发领域,内存泄露是一个常见的问题,尤其对于使用Java语言...此外,加强对Java内存管理的理解以及合理使用静态类等特性,也是防止内存泄露的重要方面。

    从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用

    【标题】:深入理解Java内存使用与优化:从代码到Java堆 【描述】:本文旨在帮助Java开发者深入了解从编写代码到Java堆的内存管理过程,以便更好地优化应用程序的内存使用。通过分析Java代码中的内存开销,以及讨论...

    Java内存监视器.rar

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

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

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

    java内存模型.pdf

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

    深入Java核心 Java内存分配原理精讲

    Java内存分配机制是Java编程语言的重要组成部分,它不仅直接影响着程序的性能,也是理解Java垃圾回收、内存泄漏等问题的关键。本文将聚焦于Java内存分配的核心概念,包括栈、堆、常量池等关键区域的功能与使用场景,...

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

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

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

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

Global site tag (gtag.js) - Google Analytics