一、内存泄漏(memory leak)
1、内存泄漏是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统奔溃等严重后果。2、一次内训泄漏似乎不会有大的影响,但内存泄漏后堆积的结果就是内存溢出。3、内存泄漏具有隐蔽性,积累性的特征,比其他内存非法访问错误更难检测。这是因为内存泄漏产生的原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏不会直接产生可观察的错误,而是逐渐积累,降低系统的整体性性能。4、如何有效的进行内存分配和释放,防止内存泄漏,是软件开发人员的关键问题,比如一个服务器应用软件要长时间服务多个客户端,若存在内存泄漏,则会逐渐堆积,导致一系列严重后果。二、内存泄漏原因1、在内存中供用户使用的空间分为三部分:程序存储区静态存储区:静态存储区数据在程序开始就已经分配好了内存,执行过程中,它们所占的存储单元是固定的,在程序结束时就 释放,所以该区数据一般为全局变量。动态存储区:动态存储区数据是在程序的执行过程中根据需要动态分配和动态释放的存储单元。2、没有释放动态分配的存储空间而造成内存泄漏,是动态存储变量的主要问题。3、常用内存管理函数如下:malloc,free,calloc,recalloc等,来完成动态存储变量存储空间的分配和释放。4、常见的内存管理错误如下分配一个内存块并使用其中未经初始化的内容;释放一个内存块,但继续引用其中的内容;子函数分配的内存空间在主函数出现异常中断时,或主函数对子函数返回的信 息使用结束时,没有对分配的内存进行释放;程序实现过程中分配的临时内存在程序结束时,没有释放临时内存;内存错误一般是不可在现的,开发人员不易在程序调式和测试阶段发现,即使花费了很多的时间和精力,也无法消除。三、内存泄漏产生方式的分类常发性内存泄漏发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。偶发性内存泄漏发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。一次性内存泄漏发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。隐式内存泄漏程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到四、内存溢出指程序在申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,就会导致内存不够用,报错OOM,即出现内存溢出的错误。
内存泄漏和内存溢出
最新推荐文章于 2024-05-09 17:24:08 发布