为了使得内存管理的开销较小,程序拥有更高的执行效率,有的语言(比如C++)会把内存的分配与回收交给开发人员在编写代码时主动完成的,使程序员可以根据自己的实际使用场景灵活进行内存分配和释放。然而手动分配和释放内存,就有可能导致内存泄漏。
定义
程序在动态分配内存后,由于某种原因未能及时释放内存,导致内存资源长时间被占用而无法再次使用。
打个比方:
有一个宾馆,共有100间房间,顾客每次都是在前台进行登记,然后拿到房间钥匙。如果有些顾客不需要该房间了,既不去前台处登记退房,也不归还钥匙,久而久之,前台处可用房间越来越少,收入也越来越少,濒临倒闭。当程序申请了内存,而不进行归还,久而久之,可用内存越来越少,OS就会进行自我保护,杀掉该进程,这就是我们常说的OOM(out of memory)
。
分类
内存泄漏可以根据内存资源类型,泄漏原因,产生方式等进行分类,相关方式可以自己百度。现在介绍根据泄漏原因进行的分类
-
堆内存泄漏:我们经常说的内存泄漏就是堆内存泄漏,在堆上申请了资源,在结束使用的时候,没有释放归还给OS,从而导致该块内存永远不会被再次使用
-
资源泄漏:通常指的是系统资源,比如socket,文件描述符等,因为这些在系统中都是有限制的,如果创建了而不归还,久而久之,就会耗尽资源,导致其他程序不可用(系统资源是指计算机系统中的各种硬件设备、软件服务、文件系统、网络连接等可供程序使用的资源。它们包括但不限于 CPU、内存、硬盘、显示器、键盘、鼠标、操作系统、网络接口等等,系统资源和内存的区别在于,系统资源包括了计算机系统中所有可供程序使用的资源,而内存是其中的一种资源。)
REF: