宗熙先生谈内存(4):什么是“内存泄露”?它有哪些危害?

图片

一、前言

作为普通数码科技爱好者朋友,可能经常会在各种场合听到一个词叫“内存泄露”,英文名称为“memory leak”。

对于没有任何编程开发基础的朋友来说,这个词可能很难理解,完全无法从字面上揣测它的意思,下面小编将浅显地向大家介绍一下什么是“内存泄露”。

图片

二、理解的难点所在

在“内存泄露”这个概念中,“内存”这部分很好理解,没有歧义,指的就是操作系统(以下用Windows举例)为各种程序和进程所分配的内存,它主要来源于用户所安装的物理内存或者用磁盘所模拟出来虚拟内存。

真正难以理解的是什么是“泄露”?什么是有关内存的“泄露”?而要理解这个概念,大家必须对Windows操作系统的内存管理机制有一定的认识。

图片

三、Windows的内存管理机制

众所周知,当一个程序被启动运行时,Windows操作系统会将该程序的所有代码和相关数据调入内存,然后再由处理器执行各种运算。

对于内存,从Windows操作系统层面来看,主要涉及三种工作:如何在确保高效、安全的情况下分配、管理和释放内存。当程序被启动时,需要为它分配内存,当程序被关闭退出时,需要尽快释放之前为其所分配、占用的内存,以节省内存资源供其他程序使用。

图片

四、什么是内存的“泄露”?

内存的“泄露”主要指的是内存释放环节,是指在程序运行过程中,之前已经分配的内存无法被及时释放或回收,导致这部分内存在不再使用后仍然被占用,无法供其他程序或同一程序的其他部分使用。

简单来说,“内存泄露”指的是一部分已经被分配、占用的内存,因为某些特殊原因,脱离正常的分配、使用和回收释放的管理机制,无法被及时释放或回收的一种特殊、异常情况。

需要强调指出的是,内存泄露是一种比较普遍的错误,它不仅可能存在于Windows操作系统中,其他操作系统内也可能会存在,各种开发语言和应用软件都有可能存在。

图片

五、造成内存泄漏的常见原因

1、忘记释放内存。这是最常见的内存泄露原因,往往和程序员的开发水平有关,程序员在分配内存后,忘记在适当的时候释放。

2、循环引用。在使用智能指针或垃圾回收机制的语言中,对象之间可能存在循环引用,导致垃圾回收器无法正确识别这些对象为可回收状态。

3、错误的指针操作。指针被重新赋值或丢失,导致原先指向的内存地址无法被访问,从而无法释放。

4、异常处理不当。在异常情况下,程序可能提前退出,导致某些内存没有被释放。

图片

六、内存泄露的影响和危害

如果内存泄露的情况比较轻,那么一般来说不会有什么明显的负面影响,最终的结果是有一小部分内存无法被操作系统回收释放,用于其他应用程序,存在内存资源浪费。

但是,如果内存泄露存在于一段常用、被频繁执行的代码中,那么随着时间的推移,这种未被释放的内存会被不断累积,它的危害就会很大,Windows操作系统的可用内存会越来越少,程序运行速度将会变慢,响应时间增加,运行会变得卡顿。

在极端情况下,内存泄露可能导致系统资源耗尽,程序无法继续运行,甚至会导致操作系统变得不稳定。某些类型的内存泄还可能会暴露用户的敏感信息,如密码、密钥等,存在严重的安全隐患。

图片

七、普通用户如何预防、解决内存泄漏?

综上所述,内存泄露主要是和应用软件的开发商和程序员有关,如何避免杜绝内存泄露是程序员需要高度重视的问题,而不是广大普通用户。

对于广大普通用户来说,为了避免出现内存泄露,应该尽量安装各种经过官方认证的最新版本应用程序。如果真的出现疑似内存泄漏的情况,比如内存可用量越来越少,运行变得卡顿的话,最简单的解决方案是重启操作系统。

道理也非常好理解,重启操作系统后,所有之前被分配、占用的内存都会被清零,重新洗牌,从而变相地解决之前所出现的内存泄漏的情况。

图片

八、小编总结

严格来说,内存泄露主要是应用软件开发商和程序员所需要关注的问题,应该培养良好的编程实践,掌握专业的检测工具,人而尽可能地效避免内存泄露,提高程序的稳定性和性能。

作为资深数码科技爱好的朋友,只需要大致理解内存泄露的概念即可,如果想进一步深入了解,则需要有一定的编程开发基础,有兴趣的朋友可以阅读专业书籍。