内存空间分配

作者: greedyhao | 来源:发表于2017-09-08 21:05 被阅读0次

欢迎关注我的博客Zhuhao's Blog获取最新文章

glibc的malloc实现,会按照分配内存大小的不同而使用不用的方法,小空间的分配会直接使用堆,大空间的分配使用的就是匿名内存映射。(目前是以128KB的空间为大小的界限)

堆实现

简单的说,就是把数据段切分为一系列2的整数幂大小的块,然后相邻的分区,哪里有位置,就使用哪里的内存;不用了就标记一个"不使用"。一般堆的顶端都有一个端点,如果当前堆顶是空的,可以调用 brk(),降低断点的位置,将空间返还给系统。

我理解的内部碎片和外部碎片

堆实现的这个"伙伴内存分配算法",虽然高速简单,但是会产生"内部碎片"和"外部碎片"。内部碎片降低空间的利用率。外部碎片则是有内存空间却由于被分成不同块而无法使用。

内存映射实现

匿名内存映射和基于文件的映射很像,匿名内存映射使用 mmap() 时,start 参数使用NULL,也就是说不管映射在什么地方,所以叫匿名。

使用匿名内存映射后,妈妈再也不用担心我的内存碎片问题了,不用直接取消映射就好,想用再映射回来。但是凡事有优点就有缺点,每个内存映射都是页的大小的整数倍,也就是说,需要分配的空间越小,对空间的浪费就越多;所以只有在对大量空间分配时才使用内存映射。

参考源

相关文章

  • Java中null、isEmpty、""的区别

    名字区别null未分配内存空间,无值,空指针isEmpty()分配了内存空间,无值""分配了内存空间,有值,值为空...

  • 内存空间分配

    欢迎关注我的博客Zhuhao's Blog获取最新文章 glibc的malloc实现,会按照分配内存大小的不同而使...

  • JS引擎之内存管理

    内存的生命周期 分配你所需要的内存 使用分配到的内存(读、写) 不需要时将其释放\归还 内存空间 JS内存空间分为...

  • 指针与引用区别

    引用与指针的区别 (1)引用是给另外一个变量取别名,所以不会分配内存空间。 指针是一个实体,需要分配内存空间。 (...

  • TS 单件设计模式

    运TS 类,首先会为静态成员开辟内存空间,静态成员的内存空间分配的时间要早于对象空间的分配。并且无论是否调用这个类...

  • C语言实战开发篇-8 动态分配内存

    为什么使用动态分配内存 如果使用指针变量接收数据,必须先为这个指针变量分配一片指向的内存空间有内存空间才能存数据 ...

  • 数据结构重学日记(八)单链表的操作

    头插法 建立新的结点分配内存空间,将新结点插入到当前链表的表头: 尾插法 建立新的结点分配内存空间,将新结点插入到...

  • PHP基础篇-写时复制

    copy on write 什么时候给$b,分配了内存空间呢?

  • C语言内存分配(重)

    内存分配的类型: 静态内存分配: 全局变量、静态全局变量、静态局部变量; 静态内存分配是在程序编译时分配的内存空间...

  • String 的 isEmpty() 与 null 与 &quo

    代码见分晓 通过程序段运行结果可以分析: a被分配了内存空间且值为空,是一种有值的绝对空; b 被分配了内存空间且...

网友评论

    本文标题:内存空间分配

    本文链接:https://www.haomeiwen.com/subject/upmnjxtx.html