内存溢出和内存泄漏的区别,产生缘由以及解决方案

1、概念与区别算法

内存溢出
out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;好比申请 了一个integer,但给它存了long才能存下的数,那就是
内存溢出
内存泄露
memory leak,是指程序在申请内存后,没法释放已申请的内存空间,一次
内存泄露
危害能够忽略,但
内存泄露
堆积后果很严重,不管多少内存,早晚会被占光。 memory leak会最终会致使out of memory!
内存溢出
就是你要求分配的内存超出了系统能给你的,系统不能知足需求,因而产生溢出。  2、内存泄露
内存泄漏
是指你向系统申请
分配内存
进行使用(new),但是使用完了之后却不归还(delete),结果你申请到的那块内 存你本身也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给须要的程序。一个 盘子用尽各类方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时 再作进栈一定产生空间溢出,叫上溢,栈空时再作退栈也产生空间溢出,称为下溢。就是分配的内存不足 以放下
数据项
序列,称为内存溢出. 以发生的方式来分类,
内存泄漏
能够分为4类: 1.
常发
内存泄漏
。发生内存泄漏的代码会被屡次执行到,每次被执行的时候都会致使一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操做过程下才会发生。
常发
性和偶发性是相对的。对 于特定的环境,偶发性的也许就变成了
常发
性的。因此
测试环境
和测试方法对检测内存泄漏相当重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者因为算法上的缺陷,致使总会有一块仅且一块内存发 生泄漏。好比,在类的
构造函数
分配内存
,在
析构函数
中却没有释放该内存,因此内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程当中不停的
分配内存
,可是直到结束的时候才释放内存。严格的说这里并无发生内 存泄漏,由于最终程序释放了全部申请的内存。可是对于一个服务器程序,须要运行几天,几周甚至几个月,不及 时释放内存也可能致使最终耗尽系统的全部内存。因此,咱们称这类内存泄漏为隐式内存泄漏。 从用户使用程序的角度来看,内存泄漏自己不会产生什么危害,做为通常的用户,根本感受不到内存泄漏的存在。 真正有危害的是内存泄漏的堆积,这会最终消耗尽系统全部的内存。从这个角度来讲,一次性内存泄漏并无什么危 害,由于它不会堆积,而隐式内存泄漏危害性则很是大,由于较之于常发性和偶发性内存泄漏它更难被检测到 3、内存溢出 内存溢出的缘由以及解决方法 引发内存溢出的缘由有不少种,小编列举一下常见的有如下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体; 4.使用的
第三方软件
中的BUG; 5.启动参数内存值设定的太小 内存溢出的解决方案: 第一步,修改JVM启动参数,直接增长内存。(-Xms,-Xmx参数必定不要忘记加。) 第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。 第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。 重点排查如下几点: 1.检查对数据库查询中,是否有一次得到所有数据的查询。通常来讲,若是一次取十万条记录到内存,就可能引发内 存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查 询就有可能引发内存溢出。所以对于数据库查询尽可能采用分页的方式查询。 2.检查代码中是否有死循环或递归调用。 3.检查是否有大循环重复产生新对象实体。 4.检查对数据库查询中,是否有一次得到所有数据的查询。通常来讲,若是一次取十万条记录到内存,就可能引发内 存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查 询就有可能引发内存溢出。所以对于数据库查询尽可能采用分页的方式查询。 5.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使 得这些对象不能被GC回收。 第四步,使用内存查看工具动态查看内存使用状况
相关文章
相关标签/搜索