`

java中存在内存泄漏的情况

JVM 
阅读更多

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

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

          List<Object> list = new ArrayList<Object>();
        for(int i=0;i<100;i++){
            Object e = new Object();
            list.add(e);
            e=null;
        }

   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内存泄露深度分析及解决

    尽管java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。的确,在大型工程中,内存泄漏是一个普遍问题。避免内存泄漏的第一步,就是要了解他们发生的原因。这篇文章就是...

    java典型的内存泄漏

    该文档是著名大师Staffan Larsen写的,他是JRockit项目的工程师之一,这个项目是...java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。该文档分析的JAVA内存泄漏的原因。

    关于Java的内存泄漏的专题知识

    Java的一个重要优点就是通过...因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。

    Java 中会存在内存泄漏吗1

    如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在

    如何识别Java中的内存泄漏

    然而可能有人不知道的是,即使使用了垃圾回收机制,Java中仍然可能存在内存泄漏风险。如果你碰到下面的错误代码:  java.lang.OutOfMemoryError: Java heap space  如果你确认是内存分配不足,那么可以通过以下...

    Java基础知识.doc

    java中会存在内存泄漏吗,请简单描述。 会,原因: 如果对象被集合类引用时,如果只是添加,而不删除,会引起内存泄漏,严重时会发出内存溢出。 Java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用...

    论文研究-Java程序内存泄漏综述.pdf

    从与C/C 内存泄漏对比的角度分析了Java内存泄漏问题,详细介绍了Java内存泄漏的相关研究和工具,探讨了当前研究和工具中存在的不足并分析了其原因,总结了内存泄漏相关领域研究的发展趋势。

    Java 程序里的内存泄漏

     摘要:Java 程序里也存在内存泄漏?当然。和流行的看法相反,内存管理仍然是 Java 编程时应该考虑的事情。在这篇文章里,你会了解到是什么原因导致了 Java 内存泄漏以及什么时候需要对这些泄漏进行关注。你也将会...

    Java程序内存泄漏研究.pdf

    java有比较安全的内存管理机制,垃圾回收器(GC)会自动地对无用的内存空间进行回收,但是GC并不能回收所有的垃圾空间,仍然存在着内存泄漏。本文从GC的工作原理入手,详细分析了产生内存泄漏的原因,讨论了几种典型内存...

    论文研究-移动应用程序内存泄露机制分析与检测方案设计.pdf

    Android开发已经成为移动开发热门领域,Android应用程序中内存使用的问题却经常容易被忽视,部分开发者对Java垃圾回收机制认识模糊,使得内存泄漏成为Android应用开发中十分隐秘但又确实存在的应用安全问题,对内存...

    java 内存泄露

    JAVA 作为常用语言也存在java 内存泄露简介,可以帮助我们进一步理解常见的问题。

    实战Hot Spot JVM GC

    在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,...通过本文可以方便的检查你的代码是否存在内存泄漏。

    C++内存管理,如何防止内存泄漏

    C++语言是一门优秀的程序设计语言,支持多种设计范型的通用语言,相对于Java、.net等托管性语言。它的执行速度超过了他们的20倍。但是C++语言编程,我们要更加注意内存的管理,他是一把双刃剑。

    图片过大引起的内存溢出解决方案

    使用BitmapFactory加载图片时,如果图片过大可能引起OutOfmemory溢出的问题。解决办法。

    JAVA 内存管理总结

    1. java是如何管理内存的  Java的内存管理是对象的分配和释放问题。(两部分)  分配 :内存的分配是由程序完成的,程序员需要通过关键字...  在Java中,内存泄漏是存在一些被分配的对象,这些对象有下面两个特点

    浅谈CC++内存泄漏及其检测工具

    不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。  内存泄漏的定义  一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序...

    Android平台下井下安全监控系统内存泄露分析

    Android平台下井下安全监控系统存在内存泄露问题。经过分析认为Java内存泄露是破坏系统的主要因素。文章着重介绍了在Android平台下开发应用程序中,内存泄露出现的原因及相应的解决办法,并通过示例程序进行说明。

    Node.js中内存泄漏分析

    内存泄漏(MemoryLeak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的...传统的C/C++中存在野指针,对象用完之后未释放等情况导致的内存泄漏。而在使用虚拟机执行的语言中如 Java、JavaScript由于使用了GC(G

    java核心面试技术点

    java 内存模型 ( java memory model ):根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有对象成员变量都储存在主存中,对于所有线程都是共享的。...

    Java虚拟机内存优化实践

    Java是从C++的基础上发展而来的,而C++程序的很大的一个问题是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露问题的,只是...

Global site tag (gtag.js) - Google Analytics