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

Posted liqing168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存泄漏和内存溢出的区别相关的知识,希望对你有一定的参考价值。

原文地址https://www.zhihu.com/question/40560123

简单来说,操作系统就像资源分配人员,你要使用内存的时候分给你,你用完了还给它。如果你使用了没有分配给你的内存就是内存溢出,如果你用完了没有还就是内存泄漏。
会引起的问题:
内存溢出存在的问题是你用了没有分配给你的内存,系统是不知道的,他又把内存分配给了其他程序,结果就是别人也写了或者读了这个内存。程序可能崩溃。当然也可能没问题,所以内存溢出往往不好查。
内存泄漏的问题就比理解,你没有还给系统,系统的内存就越来越少。直到没有可用内存。

泄漏是占着不用了,溢出是用不该用的地方;溢出一般会出事,泄漏在内存无限时不会出事。
泄漏是说你的程序有BUG 导致内存不释放。溢出是指内存不够用了 导致不够用的原因很多 泄漏只是其中一种。

内存泄露是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述。
而内存溢出是指你的应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃,这事一种结果描述。
而且通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。

所谓内存泄漏,只是一个编程习惯的问题。实际上很多内存泄漏对程序的运行不会有任何影响,有的内存泄漏,要连续不关机不重启电脑长达几十年的时间,才会被人觉察到。比如说电脑的内存有32GB,你程序分配了一块2KB的内存。而这块内存没有起任何作用,就一直放在那里。这就是内存泄漏的一种。有什么影响吗? 毫无影响。一般说内存泄漏是指分配了一块内存,用它存了一些东西,然后不再用它了,但并没有把这块内存释放掉。实际上只要程序退出了,不管泄漏不泄露,所有的内存一样会释放。内存溢出比这严重多了。比如电脑有32GB的内存,32GB全用完了,这叫内存溢出。不管内存泄漏与否,只要用了这么多内存,都会导致内存溢出。

内存溢出,这个好理解,说明存储空间不够大。就像倒水倒多了,从杯子上面溢出了来了一样。
内存泄漏,原理是,使用过的内存空间没有被及时释放,长时间占用内存,最终导致内存空间不足,而出现内存溢出。这个也很好理解,所谓的“泄漏”是相对释放对象来定义的,逃脱了释放对象的释放,漏处理了,也就是泄漏。形象一点理解,就是一个大的排放废水的池子,你用水瓢(相当于释放对象)瓢水,但是水瓢有个洞,漏了。

泄漏就是内存申请后,用完没有释放,造成可用内存越来越少。
溢出指用户实际的数据长度超过了申请的内存空间大小,导致覆盖了其他正常数据,容易造成程序异常,严重的,攻击者可以以此获取程序控制权。

内存泄露:用完扔了,没有归还。
内存溢出:霸占不属于你的资源。

以上是关于内存泄漏和内存溢出的区别的主要内容,如果未能解决你的问题,请参考以下文章

Android中的内存泄漏和内存溢出

Android中的内存泄漏和内存溢出

Android中的内存泄漏和内存溢出

JAVA内存泄漏和内存溢出的区别和联系

内存溢出和内存泄漏分别是啥意思?

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