`

java中会存在内存泄漏

    博客分类:
  • java
 
阅读更多
转载自:http://www.cnblogs.com/lane_yang/archive/2011/08/03/2126027.html

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基础知识.doc

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

    java内存泄露深度分析及解决

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

    最全面Java面试题,从corejava到javaWeb共180多题(含答案)

    【基础】31、java 中会存在内存泄漏吗,请简单描述。【基础】36、GC 是什么? 为什么要有GC? 【基础】118、Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?120、JDBC,Hibernate 分页怎样实现...

    java面试宝典

    31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法...

    java典型的内存泄漏

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

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

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

    Java 程序里的内存泄漏

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

    如何识别Java中的内存泄漏

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

    java笔试题

    1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f=3.4;...25、Java 中会存在内存泄漏吗,请简单描述。

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

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

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

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

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

    Java程序内存泄漏研究.pdf

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

    Java面试宝典-经典

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试宝典2010版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    java面试题大全(2012版)

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    千方百计笔试题大全

    31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法...

    最新Java面试宝典pdf版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    java基础题 很全面

    56. java中会存在内存泄漏吗,请简单描述。 14 57. java中实现多态的机制是什么? 14 58. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 14 59. 静态变量和实例...

Global site tag (gtag.js) - Google Analytics