内存溢出和内存泄漏的区别

对于项目的内存和cpu使用需要做测试,

先分析内存溢出和内存泄漏的概念。

概念

内存溢出(out of memory):简单讲就是 项目所需要的内存大于虚拟机提供的内存,导致内存溢出。

                     复杂一点就是由于应用中无法回收的内存和内存使用过多,导致最终项目运行所需内存大于虚拟机的内存(其实听说溢出有上溢和下溢,这里不做讨论)。

内存泄漏(memory leak):简单讲就是 由于项目出现了无用,但是GC又无法回收的对象,导致内存泄露,最后导致使用内存逐渐增大。(无用,无法回收)

                   复杂一点就是由于你申请分配内存(new),用完了后没有归还(delete),结果你申请的内存无法再次访问,也无法被程序再次使用,随着服务器的内存不断消耗,无法使用的内存越来越多,产生泄漏。

关联:

内存泄漏越来越多,最后导致内存溢出。

导致原因:

内存溢出:

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

★总体上来说,产生内存溢出是由于代码写的不好造成的,因此提高代码的质量是最根本的解决办法。

例:你声明一个integer,但是去存取了一个long类型的数

内存泄露:

数据库流未关闭

引用对象未设置空

声明时候多用static

死循环等......

★总体来说,产生内存泄漏是因为对象不再用,但是又被其他对象应用,GC无法回收

例:循环遍历一个Object,并把它add到一个对象中,Object不再使用,但是GC无法回收

解决方法:

1 、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为 null ,暗示垃圾收集器来收集该对象,防止发生内存泄露。
       对于仍然有指针指向的实例, jvm 就不会回收该资源 , 因为垃圾回收会将值为 null 的对象作为垃圾,提高 GC 回收机制效率;
2 、我们的程序里不可避免大量使用字符串处理,避免使用 String ,应大量使用 StringBuffer ,每一个 String 对象都得独立占用内存一块区域;

3 、尽量减少变量和对象的作用范围,不声明static的就不声明。

GC原理:

   GC(Garbage Collection)是java的垃圾回收,GC算法没去琢磨过,但是它是依照:回收那些不再被引用的对象内存的过程。一般我们认为正在被引用的对象状态为“alive”,而没有被应用或者取不到引用属性的对象状态为“dead”。垃圾回收是一个释放处于”dead”状态的对象的内存的过程。而垃圾回收的规则和算法被动态的作用于应用运行当中,自动回收。

   当程序对象处于不使用,但是又被另外一个对象引用着,那么GC就不会回收,就会导致内存泄漏   

---------------我是分割线--------------------------

转载请说明出处:http://blog.csdn.net/todaymz/article/details/8719814


补充:

http://www.cnblogs.com/eggbucket/archive/2012/09/24/2699574.html(内存溢出3种报错)

http://blog.csdn.net/mrmaomaochong/article/details/6014869(内存溢出详解)

http://blog.csdn.net/ousyuryu/article/details/6132288(内存溢出和GC分析)

http://blog.csdn.net/buutterfly/article/details/6617375(内存泄漏分类详解)

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章