内存溢出与内存泄漏

一.内存泄漏java

  内存泄漏指对象已经没有被应用程序使用,可是垃圾回收器没法移除它们,由于还在被引用着。数据库

  出现内存泄漏的状况和防止长生命周期的对象持有短生命周期对象的引用就极可能发生内存泄露,尽管短生命周期对象已经再也不须要,可是由于长生命周期对象持有它的引用而致使不能被回收,这就是java中内存泄露的发生场景。网络

  1.当将HashMap,ArrayList,Vector等集合定义为静态的时候,他们的声明周期将会和应用程序同样长。他们所引用的全部的对象Object也不能被释放,由于他们也将一直被Vector等引用着。静态变量是全局的,GC不会回收。socket

  2.事件监听器,当一个监听器在使用的时候被注册,但再也不使用时被反注册,会出现内存泄漏。工具

  3.若是一个类本身管理内存,常一些成员变量引用其余对象,初始化的时候须要置空。spa

  4.JDK6中的substirng()方法容易致使内存泄漏。线程

  5.各类链接 :
  好比数据库链接(dataSourse.getConnection()),网络链接(socket)和io链接,除非其显式的调用了其close()方法将其链接关闭,不然是不会自动被GC 回收的。
对象

  解决方法:经过工具查看泄漏对象到GC Roots的引用链,就能找到泄露对象是怎样的路径与GC Roots相连并致使垃圾回收器没法自动回收。递归

二.内存溢出生命周期

  内存溢出是指应用系统中存在没法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。

  出现内存溢出的状况:

  1.内村中加载的数量过大,如一次从数据库中取出多条数据:

  2.栈溢出:线程请求栈的深度大于虚拟机所容许的最大深度(即无限递归出现栈溢出)或虚拟机扩展栈时没法申请到足够的空间(建立过多的线程出现内存溢出)。

  3.堆溢出:不断地建立对象,并保证GC Root到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量后就会产生内存溢出。

  解决方案:从代码上检查是否存在某些对象声明周期过程,持有状态的时间过长等,尝试减小程序中运行期的内存消耗。

相关文章
相关标签/搜索