作者:不怕天黑_0819
链接:https://www.jianshu.com/p/61d34df7eabe

一、内存泄漏(memory leak)

1、内存泄漏是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统奔溃等严重后果。

2、一次内训泄漏似乎不会有大的影响,但内存泄漏后堆积的结果就是内存溢出。

3、内存泄漏具有隐蔽性,积累性的特征,比其他内存非法访问错误更难检测。这是因为内存泄漏产生的原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏不会直接产生可观察的错误,而是逐渐积累,降低系统的整体性性能。

4、如何有效的进行内存分配和释放,防止内存泄漏,是软件开发人员的关键问题,比如一个服务器应用软件要长时间服务多个客户端,若存在内存泄漏,则会逐渐堆积,导致一系列严重后果。

二、内存泄漏原因

1、在内存中供用户使用的空间分为三部分:

  • 程序存储区

  • 静态存储区:静态存储区数据在程序开始就已经分配好了内存,执行过程中,它们所占的存储单元是固定的,在程序结束时就 释放,所以该区数据一般为全局变量。

  • 动态存储区:动态存储区数据是在程序的执行过程中根据需要动态分配和动态释放的存储单元。

2、没有释放动态分配的存储空间而造成内存泄漏,是动态存储变量的主要问题。

3、常用内存管理函数如下:malloc,free,calloc,recalloc等,来完成动态存储变量存储空间的分配和释放。

4、常见的内存管理错误如下

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

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

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

  • 程序实现过程中分配的临时内存在程序结束时,没有释放临时内存;

  • 内存错误一般是不可在现的,开发人员不易在程序调式和测试阶段发现,即使花费了很多的时间和精力,也无法消除。

三、内存泄漏产生方式的分类

常发性内存泄漏

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

偶发性内存泄漏

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

一次性内存泄漏

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

隐式内存泄漏

程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。

但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存。

从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到

四、内存溢出

指程序在申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,就会导致内存不够用,报错OOM,即出现内存溢出的错误。

五、内存溢出的原因

内存溢出原因

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小

内存溢出的解决方案

第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

六、内存泄漏和内存溢出的联系

1、内存泄漏的堆积最终会导致内存溢出

2、内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误

3、内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。

4、内存溢出可以这样理解,一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出。比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出。说白了就是我承受不了那么多,那我就报错。

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

  1. 移动端测试=== 两个概念 内存泄漏 和 内存溢出 【转】

    关于内存在一块其实我并不是很想拿出来说,一般情况下内存这一块都是可优化的,可以通过硬件资源或者调整一些系统或者应用系统的参数配置来进行优化. 很多同僚问到了"内存泄漏"和" ...

  2. 透彻分析JAVA内存泄漏和内存溢出的区别

    JAVA内存泄漏和内存溢出的区别和联系 1.内存泄漏memory leak : 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出. 2 ...

  3. JVM——内存泄漏与内存溢出

    内存泄漏与内存溢出 1. 面试题 什么是内存泄漏和什么是内存溢出 (陌陌) Java存在内存泄漏吗,内存泄漏的场景有哪些,如何避免(百度) Java 中会存在内存泄漏吗,简述一下?(猎聘) 内存泄漏是 ...

  4. python会不会出现内存泄露_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  5. java 内存溢出 内存泄露_JVM——内存泄漏与内存溢出

    1.内存溢出 1.1 什么是Java的内存溢出? 在Java程序运行的过程中,经常会碰到以下错误:java.lang.OutOfMemoryError. 通俗讲,内存溢出是指程序在申请内存时,没有足够 ...

  6. 段错误、内存泄漏、内存溢出、堆溢出、栈溢出

    参考:内存泄漏.内存溢出.段错误.堆溢出.栈溢出 作者:焦木白 发布时间:2019-10-22 网址:https://blog.csdn.net/jiaomubai/article/details/1 ...

  7. java内存泄漏和内存溢出_Java和内存泄漏

    java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...

  8. python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法

    Python内存泄漏和内存溢出的解决方法 发布时间:2020-10-30 23:08:34 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关Python内存泄漏和内存溢出的解决方 ...

  9. python 内存溢出能捕获吗_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

最新文章

  1. 80热敏打印机打印TxPrnMod.dll
  2. A - 排名 HDU - 1236 sort(cmp)
  3. Skype for Business Server 2015-升级-实战公开课(免费视频)
  4. 基于python的scrapy爬虫抓取京东商品信息
  5. 关于向Mybatis传递多个参数进行SQL查询的用法
  6. Google Protocol Buffers和java字符串处理控制
  7. java封装原则_跟我学java编程—理解Java面向对象的封装原则
  8. spyder python调试_使用spyder编译器单步调试python
  9. IoT -- (四) 物联网系统架构介绍
  10. git统计当前项目代码行数
  11. Github-emoji表情图像大全
  12. 通过 PPT 快速给证件照换底色
  13. PS2无线遥控手柄的通讯协议以及c语言代码分析
  14. 计算机图形学基础知识-光照材质
  15. springboot+Elasticsearch实现word,pdf,txt内容抽取并高亮分词全文检索
  16. 校园网免认证软件无为WiFi卡DNS解决教程
  17. awk linux 分隔_Linux:批量修改分隔符(awk、BEGIN、FS、OFS、print、tr命令)
  18. 德律aoi程式制作_AOI入门介绍
  19. linux编译cu文件,Linux编译安装RTL8192CU芯片驱动
  20. 分布式系统的CAP原理及其应用

热门文章

  1. conda 装tensorboardx_【工欲善其事】TensorboardX的使用
  2. php正则替换%3cbr%3e_php利用正则替换过滤掉js(script)代码
  3. 8279键盘扫描c语言程序,8279键盘显示C程序
  4. spark 写mysql 设置主键_Spark Sql 连接mysql
  5. 设置RabbitMQ远程ip登录
  6. [Ahoi2013]差异[后缀数组+单调栈]
  7. xp系统本地连接服务器,本地连接,xp系统本地连接不见了怎么办
  8. php自动轮播图代码,JavaScript如何实现动态轮播图效果?(代码示例)
  9. BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】
  10. Codeforces 1408 D. Searchlights(优化DP、思维)