文章目录

  • 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】


内存碎片产生原因及解决方法相关推荐

  1. 内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)

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

  2. dos系统不能安装python模块,无法使用pip命令安装python第三方库的原因及解决方法...

    再dos中无法使用pip,命令主要是没有发现这个命令.我们先找到这个命令的位置,一般是在python里面的scripts文件夹里面.我们可以把dos切换到对应的文件夹,再使用pip命令就可以了. 如果 ...

  3. xp路由器播放服务器无响应,xp系统连不上路由器的原因及解决方法

    路由器是互联网络的枢纽,"交通警察,在生活和办公中都随处可见了.在笔记本xp系统中遇到连不上路由器的问题,这样就没办法上网了,怎么回事呢?一是软件原因,二是硬件原因,遇到xp系统连不上路由器 ...

  4. “adb不是内部或外部命令,也不是可执行的应用程序”错误原因及解决方法

    用SQLite时,可能会出现这样的错误. 原因可能是环境变量PATH没有配置或配置不正确.应该把adb.exe 所在目录加入到PATH环境变量.例如:C:\Program Files\android- ...

  5. ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....

    [标题]             ASP.NET常见错误,原因及解决方法[错误提示]    异常详细信息: System.Net.WebException: 请求因 HTTP 状态 401 失败:Un ...

  6. 虚拟机无法上网/连接失败原因及解决方法

    1.常见的普通原因解决方法 1.1 检查IP地址是否正确 命令:ip  a(空格a) 1.2 检查网卡是否配置正确 命令:cat /etc/sysconfig/network-scripts/ifcf ...

  7. 计算机开启时提示键盘错误,电脑开机出现异常提示keyboard not found的故障原因及解决方法_电脑故障...

    电脑开机后屏幕显示keyboard not found. press f2 to continue .f1 to setup,具体问题现象如下所示: 故障原因分析: 出现这样的情况大多都是电脑在开机的 ...

  8. SQL Server数据库查询速度慢的原因和解决方法

    SQL Server数据库查询速度慢的原因和解决方法 参考文章: (1)SQL Server数据库查询速度慢的原因和解决方法 (2)https://www.cnblogs.com/MyChange/p ...

  9. 跨域产生的原因及解决方法

    跨域产生的原因及解决方法 参考文章: (1)跨域产生的原因及解决方法 (2)https://www.cnblogs.com/keai/p/11418138.html 备忘一下.

  10. 启动pip时,< Fatal error in launcher: Unable to create process using ‘“‘ >问题的原因及解决方法

    启动pip时,< Fatal error in launcher: Unable to create process using '"' >问题的原因及解决方法 参考文章: (1 ...

最新文章

  1. 直流降压的简单方法_空调室内机电源电路检修方法。
  2. android monitor 汉化
  3. 世道变了!这个AI竞赛不再要刷榜成绩,直接看商业落地计划书
  4. php把时间变成整数,php怎么将字符串转为整数
  5. java小数点后两位 四舍五入_Java中double函数,四舍五入并保留小数点后两位的4种方法,BMI案例...
  6. 类的公有类型(public)和私有类型(private)
  7. 宁波深化智慧城市建设开启智能交通新模式
  8. 转 php include
  9. java中find方法_Java Document.find方法代码示例
  10. python删除行_python 删除文件中指定行
  11. javascript widget ui mvc
  12. 小米8 android9手势,当小米8SE遇到安卓9.0,体验提升一个等级!
  13. 雷林鹏分享:PHP 实例 - AJAX 与 XML
  14. 百度地图在vue中使用
  15. 文秘专业计算机基础考题,2017年大学计算机基础考试试题附带答案
  16. 使用nfsstat命令查看NFS服务器状态
  17. 听见丨谷歌DeepMind科学家黄士杰:已离开AlphaGo团队AI芯片初创团队ThinkForce完成4.5亿元A轮融资
  18. python 文件夹中的文件批量处理 高通道tif图片转换成jpg格式
  19. hdfs文件误删恢复
  20. Java中的除法结果与除数被除数的类型有关

热门文章

  1. 计算机串口程序配置,串口设置软件 串口调试工具如何使用
  2. 16、 基于STM32单片机WIFI控制家电插座
  3. python计算微积分_python 微积分计算
  4. pytorch实现segnet_pytorch版segnet复现实践
  5. GD32F103学习笔记(1)——搭建环境、编译烧写
  6. 高速PCB设计之阻焊层和助焊层的检查
  7. 【通俗易懂的通信】贝叶斯公式 全概率公式 及其理解
  8. 好用的软件网址(不一定是官网,不定时更新)
  9. 常用的WebService一览表
  10. 阿里云Maven仓库