博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
malloc 内存分配
阅读量:4564 次
发布时间:2019-06-08

本文共 978 字,大约阅读时间需要 3 分钟。

1. linux内存布局

最上层是内核空间,然后是栈空间,再然后内存映射区域,然后堆区域,最后是静态区域

2. 在Linux下分配堆内存需要使用brk系统调用,而这个系统调用只是简单地改变堆顶指针而已,也就是将堆扩大或者缩小。所以如果我们遇到这种情况,是没有办法直接将内存归还给操作系统的

3. 如果归还memory2的内存的时候,把memory1的内存也给归还了。

可以先把memory2的内存缓存起来,等用了,再给程序,不用先归还给系统。

但用容易产生内存碎片

4. tcmalloc就是一个内存分配器,管理堆内存,主要影响malloc和free,用于降低频繁分配、释放内存造成的性能损耗,并且有效地控制内存碎片

tcmalloc区别地对待大、小对象。它为每个线程分配了一个线程局部的cache,线程需要的小对象都是在其cache中分配的,由于是thread local的,所以基本上是无锁操作(在cache不够,需要增加内存时,会加锁)

同时,tcmalloc维护了进程级别的cache,所有的大对象都在这个cache中分配,由于多个线程的大对象的分配都从这个cache进行,所以必须加锁访问,细粒度、高效的自旋锁(Spinlock)

5. tcmalloc中,小于等于32 KB的对象被称为小对象,大于32 KB的是大对象。在小对象中,小于等于1024 B的对象以8n B分配,大于1025 B,小于等于32 KB的对象以128n B大小分配,例如,要分配20 B则返回的空闲块大小是24 B,小于等于B的,这样在小于等于1024 B的情况下最多浪费7 B,大于1025 B则浪费127 B。而大对象是以页大小4 KB进行对齐的,最多会浪费4KB-1 B

6. 内存池的另一个好处是我们可以为每个线程单独分配一个内存池,而不需要整个进程共用,这样在多线程的程序中,还可以避免多个线程之间同时分配内存时频繁上锁

当我们发现由于小块内存过多而引发内存碎片时,只需要将数据内存中的内存进行压缩(也就是将正在使用的内存重新排布到一起,将空闲的内存空间预留出来,可以看成内存的碎片整理),并修改句柄列表中句柄指向的实际地址,这样就可以一定程度上解决内存碎片问题

 

转载于:https://www.cnblogs.com/caopf/p/9147574.html

你可能感兴趣的文章
11、求二进制中1的个数
查看>>
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)...
查看>>
CodeForces 731A Night at the Museum
查看>>
MySQL 删除数据库
查看>>
JavaScript 字符串(String) 对象
查看>>
How to use VisualSVN Server and TortoiseSVN to host your codes and control your codes' version
查看>>
微信小程序picker组件 - 省市二级联动
查看>>
Dynamics CRM 给视图配置安全角色
查看>>
Eclipse修改已存在的SVN地址
查看>>
(转)使用 python Matplotlib 库绘图
查看>>
进程/线程切换原则
查看>>
正则表达式语法
查看>>
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
urllib 中的异常处理
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
gulp
查看>>
pgsql查询优化之模糊查询
查看>>
不变模式
查看>>
20181227 新的目标
查看>>