1、官方定义

PS:内存泄露是需要程序长时间运行才可以监测到的

2、原因

①内存溢出Out Of Memory

②内存泄露Memory Leak

通常申请内存后,不进行释放、打开文件不关闭、建立连接不释放等情况都会产生内存泄露问题。

在C语言中,从变量存在的时间生命周期角度上,把变量分为静态存储变量和动态存储变量两类。静态存储变量是指在程序运行期间分配了固定存储空间的变量而动态存储变量是指在程序运行期间根据实际需要进行动态地分配存储空间的变量。在内存中供用户使用的内存空间分为三部分:

  • 程序存储区

  • 静态存储区

  • 动态存储区。

程序中所用的数据分别存放在静态存储区和动态存储区中。静态存储区数据在程序的开始就分配好内存区,在整个程序执行过程中它们所占的存储单元是固定的,在程序结束时就释放,因此静态存储区数据一般为全局变量。动态存储区数据则是在程序执行过程中根据需要动态分配和动态释放的存储单元,动态存储区数据有三类函数形参变量、局部变量和函数调用时的现场保护与返回地址。由于动态存储变量可以根据函数调用的需要,动态地分配和释放存储空间,大大提高了内存的使用效率,使得动态存储变量在程序中被广泛使用。

开发人员进行程序开发的过程使用动态存储变量时,不可避免地面对内存管理的问题。程序中动态分配的存储空间,在程序执行完毕后需要进行释放。没有释放动态分配的存储空间而造成内存泄漏,是使用动态存储变量的主要问题。一般情况下,开发人员使用系统提供的内存管理基本函数,如malloc、recalloc、calloc、free等,完成动态存储变量存储空间的分配和释放。但是,当开发程序中使用动态存储变量较多和频繁使用函数调用时,就会经常发生内存管理错误,例如:

  • 分配一个内存块并使用其中未经初始化的内容;

  • 释放一个内存块,但继续引用其中的内容;

  • 子函数中分配的内存空间在主函数出现异常中断时、或主函数对子函数返回的信息使用结束时,没有对分配的内存进行释放;

  • 程序实现过程中分配的临时内存在程序结束时,没有释放临时内存。内存错误一般是不可再现的,开发人员不易在程序调试和测试阶段发现,即使花费了很多精力和时间,也无法彻底消除。

产生方式的分类

以产生的方式来分类,内存泄漏可以分为四类:

  1. 常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。

  2. 偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

  3. 一次性内存泄漏:发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。

  4. 隐式内存泄漏:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。

内存溢出和内存泄露的区别相关推荐

  1. java内存泄漏跟栈溢出,8.《深入理解Java虚拟机》内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别...

    内存溢出和内存泄露的区别 内存溢出:指的是程序在申请内存的时候,没有足够大的空间可以分配了. 内存泄露:指的是程序在申请内存之后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可达但无 ...

  2. 内存泄露和溢出的区别_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子?...

    JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 内存泄漏 & 内存溢出 1. 内存泄漏(memory leak ) 申请了内存用完了不释放,比如一共有 1024M ...

  3. ​Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

  4. Java内存溢出和内存泄露后怎么解决

    1.首先这里先说一下内存溢出和内存泄露的区别: 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但 ...

  5. connection timed out是什么意思_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子...

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

  6. java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足

    内存泄露 什么是内存泄露? 在维基百科上的定义如图: 中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存. 百度百科上的定义如图: OWASP上的定义: 开发者无法释放 ...

  7. java 内存溢出和内存泄漏_JAVA中的内存溢出和内存泄漏有很大的区别

    JAVA中的内存溢出和内存泄漏分别是什么,有什么联系和区别,我谈谈自己的理解. 内存泄漏(memory leak ):申请了内存不释放,比如100m的内存,分配了10m的内存一直不回收,那么可以用的内 ...

  8. 内存溢出与内存泄漏区别

    内存泄露和内存溢出的区别,内存泄露和内存溢出到底有什么区别啊1. 内存溢出和内存泄露的区别:内存溢出的角度不一样的,申请的内存空间,超出了最大的内存空间,这就叫做内存溢出,内存溢出是在申请内存空间的时 ...

  9. 内存溢出和内存泄漏的区别,产生原因以及解决方案

    一.概念与区别 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那 ...

  10. JVM——内存溢出和内存泄漏的区别

    今日本帅博主在研究JVM,今天我们就来游走于内存溢出与内存泄漏之间,且看看它们是个啥,且又有啥子区别. 1.内存溢出和内存泄漏是啥 内存溢出 out of memory,是指程序在申请内存时,没有足够 ...

最新文章

  1. 内存泄露排查之线程泄露
  2. php phar 无法创建,php composer.phar install 安装问题
  3. U盘中的autorun.inf
  4. 静态程序分析chapter5 - 常量传播分析上(Costant Propagation Analysis)
  5. CygWin / 安装软件包的方法
  6. *循环单链表[带头结点]
  7. mysql安装mac 压缩包_MySQL8.0安装详解(图文版)
  8. ES6新特性_Promise实践练习-多个文件内容读取---JavaScript_ECMAScript_ES6-ES11新特性工作笔记028
  9. Redis: Redis支持五种数据类型
  10. Windows 7,难说再见
  11. 学习笔记--maven
  12. Xcode的gdb调试
  13. 在Windows下安装GmSSL
  14. 融云android系统消息,如何解决 嵌入融云SDK后, Android 手机收不到消息推送?
  15. 4k hidpi 黑苹果_黑苹果 篇四:开启mac下的2k hidpi选项,同时开启144hz
  16. wps阶梯表格怎么做?wps阶梯表格制作教程
  17. 6自由度串联机器人D-H建模方法
  18. JS 把 Wed Jul 15 2015 00:00:00 GMT+0800 转换成2015-07-15
  19. 计算机开机主机不停地重启,电脑开机不断重启,可能是两个原因
  20. 计算机阵列的定义,磁盘阵列是什么有什么好处?怎么组成磁盘阵列呢?

热门文章

  1. 滑雪问题(动态规划)——SHOI2002
  2. 网站首页被K了解决方案
  3. 【科普】华为支付保护中心有什么用?
  4. 做好发票真伪自查,及时规避税务风险
  5. Layui各种样式弹出框
  6. 分享112个JS菜单导航,总有一款适合您
  7. Angular学习(5)- 数组双向梆定+filter
  8. vm虚拟机nat模式配置
  9. MATLAB中利用awgn加噪
  10. java夯实基础-运算符