`

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

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

    Java 面试宝典

    一. Java 基础部分............................................................................................................43、Java 中的异常处理机制的简单原理和应用。 .....................................

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    问题描述: 在开发项目过程中,需要处理算法分析出来二进制流数据,并对数据解析处理转发。我们上层应用平台是使用java开发的,但开放平台是使用c++开发,虽提供给我们对应的.h头文件,但在java中来解析这些数据就...

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

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

    java内存管理问题及解决办法

    主要描述java的内存管理机制、释放条件,及内存泄漏的几种可能,四种引用内存的方式各自的优缺点。对很多人来说java的内存管理不再只是个黑盒子

    java的垃圾回收与内存泄露的关系2---马克-to-win java视频

    垃圾回收 内存泄露 马克-to-win java视频的详细描述介绍

    常见数据结构及算法(Java语言描述).zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    数据结构与算法分析 Java语言描述 习题解答.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    java笔试题

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

    《数据结构与算法:Java语言描述》源码.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    java面试宝典

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

    Java常见面试问题整理.docx

    直接内存:不受JVM GC管理,直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/...

    java 面试题 总结

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

    《数据结构与算法分析(Java语言描述版本)》中介绍的算法与数据结构.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    检测was运行中的内存溢出问题

    该文档整合了网上所有的关于描述was(webSphere)下生成许多phd文件的描述,生成的该文件占用了大量的存储空间,不及时清理很可能导致程序报错,如上传文件上传不了等问题。产生该类文件的原因包括JVM设置的最小内存...

    java基础题 很全面

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

    java面试宝典2012版.pdf

    Java面试宝典2012版 一. Java基础部分 1、一个".java"源文件中是否可以包括多个类(不是内部类)?...81、java中会存在内存泄漏吗,请简单描述。 82、能不能自己写个类,也叫java.lang.String? 83. Java代码查错

Global site tag (gtag.js) - Google Analytics