Java进阶—关于内存泄露和内存溢出

概念

内存溢出(out of memory)是因为在内存中创建了大量在引用的对象和变量,导致程序后续再申请内存时没有足够的内存空间供其使用。
内存泄露(memory leak)是指程序申请完内存后,无法释放已申请的内存空间,(不再使用的对象或者变量仍占内存空间)。

两者的联系

  1. 一次内存泄漏不会有大的影响,但内存泄漏堆积后的最终会导致内存溢出。
  2. 内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。
  3. 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。

内存溢出的原因及解决方法

内存溢出原因:

  1. 内存中加载的数据量过于庞大,如一次从数据库取出过多数据。
  2. 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;。
  3. 代码中存在死循环或递归调用,产生过多重复的对象。
  4. 使用的第三方软件中的BUG。
  5. JVM内存参数值设定的过小。

内存溢出的解决方案:

  1. 修改JVM启动参数,直接增加内存,(-Xms,-Xmx参数)。
  2. 检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
  3. 对代码进行走查和分析,找出可能发生内存溢出的位置。
  4. 使用内存查看工具动态查看内存使用情况。
------ 本文完 ------