当前位置:首页 > 内存 > 正文

内存泄漏现象(内存泄漏什么意思)

  • 内存
  • 2024-08-22 23:31:48
  • 2928

一、内存泄漏是编写代码时最不想要遇到的情况之一,为什么?

内存泄漏是编写代码时最不想遇到的情况之一。当发生这种情况时,你需要停止程序运行或者根本不运行程序,找到错误并进行修改,因为内存泄漏。这是一种信息被给予空间但最终没有被回收的现象。

1、从静态的独特优势来看

静态单例的不回收是内存泄漏最常见的原因,因为静态单例的循环寿命与循环。就好像我借了你的钱,你的一部分钱到了我手里,我答应在预定的时间内还清。但如果忘记了,就无法挽回,等到资金链断裂,才终于想起来。

2.外部类不再使用,但是内部类还在使用,这块内存没有释放,所以外部类没有被回收,这也造成了系统内存的泄漏。3.连接库和协议

当我们连接数据库或者网络连接时,需要使用数据传输,直到连接结束才关闭,这使得很多东西无法回收,导致内存泄漏,应用程序崩溃并冻结。

4.请求的范围并且不留空,将会发生内存泄漏。


二、是内存泄漏ConcurrentBag原因是什么内存泄漏也称为“存储泄漏”。使用动态存储分配功能动态开辟的空间在使用后并没有释放,导致内存设备一直处于繁忙状态。直到程序结束。(其实说白了就是内存空间使用后没有被回收),这就是所谓的内存泄漏。
内存泄漏的比喻是“操作系统可以提供给所有进程的存储空间被某个进程耗尽了。最终的结果是程序运行的时间越长,占用的存储空间就越来越多”,最终所有存储空间都被用完,导致整个系统崩溃。这里的存储空间指的是虚拟内存大小,如果程序请求的一块内存没有指向它的指针,就会发生内存泄漏。
按照发生方式分类,内存泄漏可以分为4类:
重复
导致内存泄漏的代码会被执行多次,每次执行都会导致内存泄漏。
简单
导致内存泄漏的代码只会在某些情况或操作下才会发生。频繁和偶发是相对的。在某些情况下,零星的事情可能会变得普遍。所以测试环境和测试方法对于检测内存泄漏至关重要。
一次性
导致内存泄漏的代码只会执行一次,或者由于算法错误,总会有且只有一块内存泄漏。例如,如果在类的构造函数中分配了内存,但在析构函数中没有释放内存,则内存泄漏只会发生一次。
隐式程序
在运行过程中不断分配内存,但直到结束才释放内存。严格来说,这里不存在内存泄漏,因为程序最终释放了所有请求的内存。但对于需要运行数天、数周、甚至数月的服务器应用程序来说,未能及时释放内存也会导致整个系统的内存被耗尽。因此,我们将这种类型的内存泄漏称为隐式内存泄漏。
危险
从使用程序的用户角度来看,内存泄漏本身不会造成任何危害。作为普通用户,根本不会感觉到有什么内存泄漏的情况。真正有害的是内存泄漏的积累,最终会消耗掉整个系统的内存。从这个角度来看,一次性内存泄漏并没有什么危害,因为它们不会累积,而隐式内存泄漏则非常有害,因为它们比重复出现和偶发的内存泄漏更难检测。
性能
内存泄漏,或者说,资源用完后系统会发生什么?
CPU资源占用:估计机器变得无响应,包括键盘、鼠标、网络等。这种情况在Windows上经常出现,尤其是中毒时。
进程ID耗尽:无法创建新进程,也无法创建串口和telnet。
硬盘疲劳:机器快要死了,交换内存无法使用,日志也无法使用。
内存泄漏或内存清空:无法创建新连接并且可用内存较少。存在内存泄漏的程序有很多,但如果想要一定的后果,进程就必须是死循环、服务进程。当然,核心也是无限循环的,所以如果核心发生内存泄漏,情况会更糟。内存泄漏是一个很难发现和追踪的错误。目前还没有看到什么好用的工具(当然用户空间也有一些工具,包括静态分析和动态分析,但是寻找内核内存泄漏,还没有好的开源工具)。
内存泄漏与对象引用计数密切相关。另外,c/c++没有自动垃圾回收机制。如果不手动释放内存,就会出现问题。如果想要避免这个问题,还是需要从代码开始,良好的编码习惯和标准是避免错误的唯一途径。
一般我们常说的内存泄漏是指堆内存的泄漏。
堆内存是指程序从堆中分配的内存,无论大小(内存块的大小可以在程序执行过程中确定),并且在使用后必须显式释放。
应用程序通常使用malloc、realloc、new等函数从堆中分配一块内存。使用完之后,程序必须负责相应的调用free或者delete来释放该内存块,再次使用的时候,我们就说这块内存被泄漏了。

上一篇:内存泄漏解决方案

下一篇:内存泄漏csdn