什么是内存泄漏?

在wikipedia这样解读内存泄漏的:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

内存不是无穷无尽的,是有限的,如果申请了,使用了,用完没有释放,那么这块内存就一直无法被重新利用,最后再申请内存就找不到空闲的了(称为out of memory,OOM),可能导致程序逻辑错误崩溃。

以下用一个简单的例子说明内存泄漏:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{char *p[1000];int i;for (i = 0; i < 1000; i++) {p[i] = malloc(i * 2 + 100);if (p[i])memset(p[i], 0, i * 2 + 100);}for (i = 0; i < 1000; i++) {printf("%p\n", p[i]);}return 0;
}

上面的程序malloc申请的内存直至退出都没有被释放,这个就是内存泄漏了。

分类

1.内存泄漏可以根据发生的方式来分类:

常发性泄漏 

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

偶发性泄漏 

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

一次性泄漏 

故障代码只会被执行一次或者由于逻辑的缺陷导致只有一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存。

隐式泄漏 

程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但对于daemon或需要长时间运行的程序来讲,不及时释放可能最终耗尽所有内存。

2.还可以根据泄漏类型来分类:

未引用泄漏 

这些泄漏点,已无任何指针指向,因此无法被找到,永远无法被释放。native/kernel有这类问题,而java无此类问题,因为没被找到的,都可以gc。引用泄漏 可以被找到,等于隐式泄漏。

引用泄漏

像是缓存没有控制上限而导致耗尽内存。如果控制的好,则没问题,比如kernel里的slub也有per cpu缓存。java也有这种问题存在。另外不同的软件层都有可能存在内存泄漏:kernel层、native层和java层。不同的软件层泄漏的原理都差不多。

危害

内存泄漏是较难检测的异常之一,除了常发性泄漏,其他都是难以检查到的。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为用户无法感觉到内存泄漏的存在,除非泄漏大量内存或一直累积直至消耗光内存,这时就有各种明显表现:

  • 性能渐渐变差,因为要做各种内存回收工作。

  • 直接出现逻辑错误崩溃,没有做好异常处理(error handling)。

  • 本身没有问题,却引起其他程序异常。既然内存泄漏这么难处理,那么是否有办法自动回收,不需要编程人员管理申请的内存呢?有的,java语言就有内存回收机制(垃圾回收,gc)。

不过即使用java编写的程序也可能出现泄漏,后面会讲解java内存泄漏的原理和调试方法。

通用的调试方法

需要对每一块申请的内存做标记,记录调用栈等信息,然后监控内存用量信息,感觉已经超出正常的内存用量很多时(相差不大时不见得能查到问题),提取这些信息,然后分析信息,找出可能的泄漏点,检查代码,分析逻辑,修复问题。


  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python cx_oracle配置_python连接oracle的模块cx_Oracle安装和配置

下载相应版本的cx_Oracle安装cx_Oracle-5.1.2-11g-py24-1.x86_64.rpm&#xff0c;其他版本类似&#xff0c;rpm -ivh cx_Oracle-5.1.2-11g-py24-1.x86_64.rpm安装简单&#xff0c;但需要配置下面的环境变量和软连接在/etc/profile,添加export LD_LIBRARY_PATH/usr/lib/oracle/…

requests库之处理响应

response对象&#xff1a; http状态码 利用response把流存储成图片或者文件 一个下载图片的实例 import requestsdef download_pic():#headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36…

持久化概述

持久化概述 文章目录持久化概述对象持久化扁平文件pickleshelve数据库ORM扁平文件保留类型还原eval字符串转列表&#xff08;不带&#xff0c;&#xff09;![](https://img-blog.csdnimg.cn/20200201211443931.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,sha…

五分钟读懂TCP 协议

TCP 是互联网核心协议之一&#xff0c;本文介绍它的基础知识。一、TCP 协议的作用互联网由一整套协议构成。TCP 只是其中的一层&#xff0c;有着自己的分工。&#xff08;图片说明&#xff1a;TCP 是以太网协议和 IP 协议的上层协议&#xff0c;也是应用层协议的下层协议。&…

git原理浅析及命令介绍

状态描写叙述 请记住&#xff0c;工作文件夹以下的全部文件都不外乎这两种状态&#xff1a;已跟踪或未跟踪。已跟踪的文件是指本来就被纳入版本号控制管理的文件&#xff0c;在上次快照中有它们的记录&#xff0c;工作一段时间后&#xff0c;它们的状态可能是未更新。已改动或者…

python怎么跳转到某一行代码_Python中免验证跳转到内容页的实例代码

在本篇文章里小编给大家整理的是一篇关于Python中免验证跳转到内容页的实例代码&#xff0c;有兴趣的朋友们可以学习分享下。相信很多人在浏览网页时&#xff0c;经常会碰到需要输入验证码才可以继续浏览的情况吧&#xff0c;遇到这种问题&#xff0c;大多数人只能进行繁琐的注…

正则表达

文章目录正则表达数据验证字面值\d查数字^\w特殊符号匹配规则.除|n所有字符\d查数字\D非数字![在这里插入图片描述](https://img-blog.csdnimg.cn/20200203213049246.png)\s空白字符![在这里插入图片描述](https://img-blog.csdnimg.cn/20200203213145246.png)\S非空白字符![在…

《从三月开始……》

很多时候&#xff0c;我们对不同现状有所不满——对无法冲破的工作瓶颈不满对久不增长的收入不满对久不下降的体重不满对无法提高的学分不满对没有进展的关系不满……似乎总有某个方面的不顺给我们带来烦恼为此&#xff0c;我们也做了“努力”——我们通过各种渠道和平台去查阅…

Thread.join()

1.join() join()的作用是&#xff1a;“等待该线程终止”&#xff0c;这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码&#xff0c;只有等到子线程结束了才能执行。 主线程生成并起动了子线程&#xff0c;而子线程里要进行大…

管理系统制作的python代码_python学生管理系统代码实现

本文实例为大家分享了python学生管理系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下类class Student:stuID ""name ""sex "M"classID "NULL"#set IDdef setStuID(self,stuID):self.stuID stuIDdef setName(self,…

从未知到2019年的文章汇总

2018年下半年我正式把这个遗弃了很久的微信号运营起来&#xff0c;2019年应该是比较正式的一年&#xff0c;也是成长最快的一年。从开始捣鼓微信公众号到现在&#xff0c;我写了很多东西。这篇文章把之前写过的&#xff0c;不管是好的&#xff0c;还是不好的&#xff0c;都整理…

python modbus控制plc_python Modbus基础

modbus 协议 数据格式00 00 00 00 00 06 01 03 00 00 00 02 ascii码第一位&#xff1a;事务处理标识符 由服务器复制&#xff0c;通常为0第二位&#xff1a;事务处理标识符 由服务器复制&#xff0c;通常为0第三位&#xff1a;协议标识符0第四位&#xff1a;协议标识符0第五…

Binder远程转本地

前言在[031]Binder线程栈复用中&#xff0c;我们说到Binder驱动通过“线程栈复用”减少线程数&#xff0c;我们来讲一讲另外一个机制“远程转本地”&#xff0c;将远程Binder调用转化成本地方法调用。一、写个Demointerface IServiceB {void sendMsg(String msg); }1.1 Client…

linux这样去掉文件里高亮字体

终端输入&#xff1a;noh转载于:https://www.cnblogs.com/S--S/p/7365407.html

pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)

1. SRCNN1.1. Contributionend-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 )。指出了超分辨方向上传统方法( sparse-coding-based SR methods )与深度学习方法的关系&#xff0c;insightful 。SRCNN网络非常简单&#xff0c;PSNR、SSIM 等却有小幅提升…

5类主题词汇(2)

社会热点 信息科技 cyber 网络 telecommunication电讯 network网络 website 网站 blog 博客 access接近 进入 profile概况 简介 database数据库 digital数字的 数码的 keyboard键盘 hardware硬件 software软件 application程序 surf冲浪 surf on the internet 网上冲浪 chat …

存储对手机性能的影响

前言几年以前&#xff0c;我被派去厦门上门去分析一个用户的手机卡顿问题&#xff0c;该用户的手机经常莫名无响应&#xff0c;刷机&#xff0c;恢复出厂都没有用&#xff0c;经过一通分析&#xff0c;原来该用户从熟人店里买到了一张盗版的SD卡&#xff08;这年头坑的就是朋友…

python周末吃什么_中午不知道吃什么?用Python爬取美团外卖评论帮你选餐!

分析url的网页源代码&#xff0c;在源代码里有我们想要的评论数据&#xff0c;我们可以用正则(在这里正则还是比较好用的)把我们想要的信息弄下来开启循环&#xff0c;批量抓取保存数据至文本和数据库defparse_one_page(html):pattern2 re.compile( "m_type":"…

5类主题词汇(3)

道德价值 business ethics商业道德 professional ethics个人道德 virtue美德 moral value道德价值 improve public morals改进社会风气 safeguard public morals维护社会风气 injure public morality损害公共道德 fight against piracy抵制盗版 observe/obey the laws守法 be …

进阶攻略|前端最全的框架总结

前端的技术日渐更新&#xff0c;最近得空&#xff0c;花了一上午的时间&#xff0c;将前端常见的UI框架总结了一下&#xff0c;在开发的过程之中&#xff0c;有了这些&#xff0c;不断能够提高自己的工作效率&#xff0c;还可以在工作之余了解更多。希望大家喜欢。1.Layui官方网…