内存不是完全随机读写嘛,和机械硬盘是不同的物理介质,那么内存中是否有内存碎片为什么还会影响性能呢?这个内存碎片到底是指什么
内存分配器一般是预先向OS申请一大段内存,然后每次 malloc()时标记一小段为已分配,free()这一小段时再标成未分配。
malloc()
free()
malloc/free的顺序一般是任意的,那么在多次malloc/free后分配和未分配会交替存在,如分配1 -- 未分配1 -- 分配2 -- 未分配2,即未分配内存是一个个"碎片"。
分配1 -- 未分配1 -- 分配2 -- 未分配2
内存碎片的坏处:
额外占用内存: 即使未分配总量足够,仍然可能分不出连续内存,此时需要向OS申请更多
影响cache: cache是以页为单位的,一页中的未分配部分一样要占用cache
最好的办法就是不用系统的默认进程堆。而是自己申请一个新的内存堆。一类的数据放在一个堆里。这适合频繁申请和释放的小段数据。也可以是自己先malloc一大块数据,再用自己的内存池来管理。前一种,Windows的文件管理器Explore有这么用。比如遍历的目录树结构,就是放在单独的堆里,一次HeapFree释放整个堆,而不需要一次次把叶子节点释放了。第二种,比如libjpeg自己就是有一个专门的内存池。
可以了解一下buddy algorithm
还有这个PDF
打不开就翻墙哦
想了解下malloc实现就去看看dlmalloc的源码哦,不复杂
malloc
dlmalloc
内存分配器一般是预先向OS申请一大段内存,然后每次
malloc()
时标记一小段为已分配,free()
这一小段时再标成未分配。malloc/free的顺序一般是任意的,那么在多次malloc/free后分配和未分配会交替存在,如
分配1 -- 未分配1 -- 分配2 -- 未分配2
,即未分配内存是一个个"碎片"。内存碎片的坏处:
额外占用内存: 即使未分配总量足够,仍然可能分不出连续内存,此时需要向OS申请更多
影响cache: cache是以页为单位的,一页中的未分配部分一样要占用cache
最好的办法就是不用系统的默认进程堆。而是自己申请一个新的内存堆。一类的数据放在一个堆里。这适合频繁申请和释放的小段数据。
也可以是自己先malloc一大块数据,再用自己的内存池来管理。
前一种,Windows的文件管理器Explore有这么用。比如遍历的目录树结构,就是放在单独的堆里,一次HeapFree释放整个堆,而不需要一次次把叶子节点释放了。
第二种,比如libjpeg自己就是有一个专门的内存池。
可以了解一下buddy algorithm
还有这个PDF
打不开就翻墙哦
想了解下
malloc
实现就去看看dlmalloc
的源码哦,不复杂