内存碎片通常分为内部碎片和外部碎片:

  1. 内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片,通常内部碎片难以完全避免;
  2. 外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域。
    现在普遍采用的段页式内存分配方式就是将进程的内存区域分为不同的段,然后将每一段由多个固定大小的页组成。通过页表机制,使段内的页可以不必连续处于同一内存区域,从而减少了外部碎片,然而同一页内仍然可能存在少量的内部碎片,只是一页的内存空间本就较小,从而使可能存在的内部碎片也较少。

解决办法:

首先,使用最原始的标记分配方法,系统需要维护一个简单的内存信息表:


我们发现,现在可用内存空间为3,但是,这3个空闲空间,并不是连续的。所以,如果程序现在申请长度为3的内存空间,同样会申请不了,会出现内存不够。业界把这种情况,称之为【内存碎片】。

明明剩余有3个空间,却申请不了3个内存空间,这TMD扯蛋?

于是,工程师们,发明了基于页面的内存管理方式:

首先,把物理内存,按照某种尺寸,进行平均分割。比如我现在以2个内存单位,来分割内存,也就是每两个连续的内存空间,组成一个内存页:




这种方案是不是爽得多?没有碎片,能够尽量地全部用完空间。但仔细想想,这种优势背后,也是需要付出大量代价的。

前面那种内存分配方式,虽然容易出现碎片,并且内存空间的利用率低,但是使用性能高,程序能直接从内存信息表获取内存地址,接着就可以直接按照地址来使用内存空间了。

但下面这种分页的方式,程序需要记录的是内存页ID,每次使用时,需要从内存页ID翻译成实际内存地址,多了一次转换。而且这种模式,会浪费一些内存,比如上面申请3个内存空间,实际分配了2个页面共4个内存空间,浪费了1个内存空间。

以上就是基本原理,实际系统中会做非常多的优化。目前各种主流操作系统都是分页的方式,因此你不需要太关心碎片。

来源:知乎
链接:https://www.zhihu.com/question/51836333/answer/145693402

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

  1. linux系统中无法找到指定模块(终极解决办法)

    运行 demo.py 时,如上图,不管如何修改代码都显示找不到模块. 代码结构如下: 出现问题:在多目录结构的代码中,容易出现找不到模块的情况,但确实是有模块却找不到原因. 终极解决办法: 在impo ...

  2. 1067 mysql,mysql免安装版1067错误终极解决办法图文教程

    [从笔记本到pc] 笔记本一直都使用MySQL免安装版5.6.17,使用如下方法安装: 今天把同一个zip包传到pc上,按上面的方法安装居然报1067,按上面方法多次尝试还是不行. 百度,google ...

  3. 终极解决办法rvct Cannot obtain license for Compiler (feature compiler) with license version = 3.1...

    参考:https://blog.csdn.net/nic_r/article/details/7458038 1 ARM C/C++ Compiler, RVCT4.0 [Build 400] 2 a ...

  4. apmserv mysql5.1启动失败_使用APMServ时出现“1、Apache启动失败,请检查相关配置。√MySQL5.1已启动。”错误的终极解决办法:...

    使用APMServ时出现"1.Apache启动失败,请检查相关配置.√MySQL5.1已启动."错误的终极解决办法: from:http://www.hebei35.cn/blog ...

  5. 织梦DedeCMS后台模块管理列表不显示 【终极解决办法】

    织梦系统上传到空间之后,点击"模块管理"里面的"模块列表"显示空白的解决办法 网上很多关于织梦后台模块管理列表不显示的解决办法,但是大多无效,下面这种方法是小菜 ...

  6. OBS无图像(黑屏)的终极解决办法(含切换集显无效办法)

    OBS无图像(黑屏)的终极解决办法 OBS录制无图像问题困扰了我很久,一直没有找到原因.最开始的时候,手动切换到集显还能用,但是系统升级到Win10 1909之后,发现这个问题似乎更严重了 这篇文章详 ...

  7. 苹果手机(IOS)下载不上安装不上charles证书(不弹出下载框)终极解决办法

    基本上能找到这里的,肯定都试过很多方法了 下载官网证书的办法也试过,将charles的证书文件下载到苹果手机也试过,但是还是不可以安装证书, 官网安装的证书不匹配. 下面给出终极解决办法: 利用fid ...

  8. 腾讯管家禁用好压右键进程,影响用户使用,的终极解决办法

    腾讯管家拦截好压右键进程,好压右键进程被腾讯管家设为"可以禁用",这样的话,腾讯管家每次自动清理优化的时候,就会自动禁用掉标记为"可以禁用"的项目,所以好压的右 ...

  9. .net4.5对应的安装mysql dll文件的版本_cmd下使用mysql插入中文出现无法退出语句的情况!终极解决办法! 安装mysql详细教程。...

    当你插入中文时遇到这种情况,始终无法退出. 当前数据库:网上下载的奇奇怪怪版本5.5 当前系统win10 当前CMD输入编码utf8 数据库编码utf8 表编码utf8 mysql> inser ...

  10. rosdep update timeout问题终极解决办法

    rosdep update timeout问题终极解决办法 [问题描述] rosdep update reading in sources list data from /etc/ros/rosdep ...

最新文章

  1. 单链表-在带头结点的单链表L中删除一个最小值结点(四指针)
  2. css中“[]”、“”“~”、“,”、“+”和“”详解
  3. 邻接矩阵中啥时候写0和无穷_集合中的上极限与下极限
  4. PowerDesigner使用教程3
  5. 重新认识mysql基本知识
  6. Spring3 @ResponseBody注解引起头部Accept-Charset过大
  7. android 小球效果,Android开发实现跟随手指的小球效果示例
  8. Scala enumeration
  9. oracle 查看数据库性能,oracle 11G使用statspack查看数据库的性能
  10. PLSQL Developer学习笔记
  11. Java Web开发技术教程入门-Model1和Model2
  12. sqlServer对内存的管理
  13. 春节健康膳食,合理配搭
  14. UML2.0详细教程(附示例)
  15. C语言判断完数(完整版)
  16. ansys linux运行_ANSYS|大型Linux计算机ANSYS运算要点
  17. 1.4多媒体技术的发展历史
  18. 2015年蓝桥杯省赛C++(A组) 第三题 奇妙的数字
  19. SQLiteHelper帮助类
  20. bootstrap 常用class

热门文章

  1. 摄像机没有连接到计算机代码45,摄像头错误代码的解决办法
  2. 个人理财系统springboot项目开发(一)需求分析文档
  3. Diamond软件的使用--(1)软件安装及配置
  4. TCP通信调试助手===wireshark使用
  5. 电气工程及其自动化用matlab,计算机仿真技术与CAD--基于MATLAB的电气工程(电气工程及其自动化专业精品教材普通高等教育十三...
  6. 网易云IM(即时通讯) 互动直播集成
  7. 关于阿里矢量图标的三种使用方法
  8. unity开发微信小游戏1
  9. 软考中级软件设计师--11.结构化开发
  10. java运用itextpdf批量添加书签