Ist das Lesen und Schreiben im Speicher nicht völlig zufällig? Es handelt sich um ein anderes physisches Medium als die mechanische Festplatte. Warum wirkt es sich also auf die Leistung aus, wenn sich im Speicher Speicherfragmente befinden? Worauf genau bezieht sich diese Speicherfragmentierung?
内存分配器一般是预先向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
的源码哦,不复杂