内存碎片产生原因及解决方法
文章目录
- 1、现象描述
- 2、原因分析
- 3、解决方法
1、现象描述
- 某些应用程序频繁调用 malloc函数申请内存空间,且申请空间的大小差别比较大,使用完成后通过 free函数释放内存空间,但内存空间依然缓存在glibc中,没有归还操作系统,导致系统内存不足。
2、原因分析
Glibc中进程的内存分配由两个系统调用完成: brk 和 mmap:
- brk 是将数据段(.data)的最高地址指针 _edata 往高地址推; brk 分配的内存需要等到高地址内存释放以后才能释放;
假设先后通过 brk 申请了A和B两块内存,在B释放之前, A是不可能释放的,仍然被进程占用,通过TOP查看疑似“内存泄露”。 - mmap 是在进程的虚拟地址空间中申请一块空闲的空间。 mmap 分配的内存由 munmap 释放,内存释放时将立即归还操作系统。
默认情况下,大于等于128KB的内存分配会调用 mmap/mummap,小于128KB的内存请求调用 brk,但可以通过修改M_MMAP_THRESHOLD 值来调整。
另外, Glibc2.29有一个新特性: M_MMAP_THRESHOLD 可以动态调整。
M_MMAP_THRESHOLD的值在128KB到32MB(32位机)或者64MB(64位机)之间动态调整,如:当申请并释放一个大小为2MB的内存后, M_MMAP_THRESHOLD的值被调整为2M到2M + 4K之间的一个值。因此,当应用程序中申请的内存空间数量多,且先后申请的内存空间的大小变化比较大时,再申请一段大的内存后, M_MMAP_THRESHOLD的值被调大,后续的内存申请空间大小 < M_MMAP_THRESHOLD时将使用 brk 申请,而 brk 需要等到高地址内存释放以后,低地址内存才能释放。当应用程序没有释放高地址内存时,就导致大量低地址内存空间不能及时释放,从而产生“内存空洞”,导致系统内存不足。
3、解决方法
- 在进程启动时,使用 int mallopt(int param, int value) 函数显式地设置 M_MMAP_THRESHOLD 的值为128K,关闭M_MMAP_THRESHOLD动态调整特性【图1-1】
- 优化应用程序中内存管理方式,不要频繁申请、释放内存空间,减少内存碎片。
【图1-1】
内存碎片产生原因及解决方法相关推荐
- 内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)
一.定义(概念与区别) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请 了一个integer,但给它存了long才能存 ...
- dos系统不能安装python模块,无法使用pip命令安装python第三方库的原因及解决方法...
再dos中无法使用pip,命令主要是没有发现这个命令.我们先找到这个命令的位置,一般是在python里面的scripts文件夹里面.我们可以把dos切换到对应的文件夹,再使用pip命令就可以了. 如果 ...
- xp路由器播放服务器无响应,xp系统连不上路由器的原因及解决方法
路由器是互联网络的枢纽,"交通警察,在生活和办公中都随处可见了.在笔记本xp系统中遇到连不上路由器的问题,这样就没办法上网了,怎么回事呢?一是软件原因,二是硬件原因,遇到xp系统连不上路由器 ...
- “adb不是内部或外部命令,也不是可执行的应用程序”错误原因及解决方法
用SQLite时,可能会出现这样的错误. 原因可能是环境变量PATH没有配置或配置不正确.应该把adb.exe 所在目录加入到PATH环境变量.例如:C:\Program Files\android- ...
- ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....
[标题] ASP.NET常见错误,原因及解决方法[错误提示] 异常详细信息: System.Net.WebException: 请求因 HTTP 状态 401 失败:Un ...
- 虚拟机无法上网/连接失败原因及解决方法
1.常见的普通原因解决方法 1.1 检查IP地址是否正确 命令:ip a(空格a) 1.2 检查网卡是否配置正确 命令:cat /etc/sysconfig/network-scripts/ifcf ...
- 计算机开启时提示键盘错误,电脑开机出现异常提示keyboard not found的故障原因及解决方法_电脑故障...
电脑开机后屏幕显示keyboard not found. press f2 to continue .f1 to setup,具体问题现象如下所示: 故障原因分析: 出现这样的情况大多都是电脑在开机的 ...
- SQL Server数据库查询速度慢的原因和解决方法
SQL Server数据库查询速度慢的原因和解决方法 参考文章: (1)SQL Server数据库查询速度慢的原因和解决方法 (2)https://www.cnblogs.com/MyChange/p ...
- 跨域产生的原因及解决方法
跨域产生的原因及解决方法 参考文章: (1)跨域产生的原因及解决方法 (2)https://www.cnblogs.com/keai/p/11418138.html 备忘一下.
- 启动pip时,< Fatal error in launcher: Unable to create process using ‘“‘ >问题的原因及解决方法
启动pip时,< Fatal error in launcher: Unable to create process using '"' >问题的原因及解决方法 参考文章: (1 ...
最新文章
- 直流降压的简单方法_空调室内机电源电路检修方法。
- android monitor 汉化
- 世道变了!这个AI竞赛不再要刷榜成绩,直接看商业落地计划书
- php把时间变成整数,php怎么将字符串转为整数
- java小数点后两位 四舍五入_Java中double函数,四舍五入并保留小数点后两位的4种方法,BMI案例...
- 类的公有类型(public)和私有类型(private)
- 宁波深化智慧城市建设开启智能交通新模式
- 转 php include
- java中find方法_Java Document.find方法代码示例
- python删除行_python 删除文件中指定行
- javascript widget ui mvc
- 小米8 android9手势,当小米8SE遇到安卓9.0,体验提升一个等级!
- 雷林鹏分享:PHP 实例 - AJAX 与 XML
- 百度地图在vue中使用
- 文秘专业计算机基础考题,2017年大学计算机基础考试试题附带答案
- 使用nfsstat命令查看NFS服务器状态
- 听见丨谷歌DeepMind科学家黄士杰:已离开AlphaGo团队AI芯片初创团队ThinkForce完成4.5亿元A轮融资
- python 文件夹中的文件批量处理 高通道tif图片转换成jpg格式
- hdfs文件误删恢复
- Java中的除法结果与除数被除数的类型有关