搜索

首页  >  问答  >  正文

php - c语言编程中提及的内存碎片该怎么理解?为什么要尽可能避免他?

内存不是完全随机读写嘛,和机械硬盘是不同的物理介质,那么内存中是否有内存碎片为什么还会影响性能呢?这个内存碎片到底是指什么

滿天的星座滿天的星座2743 天前940

全部回复(3)我来回复

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-24 09:44:23

    内存分配器一般是预先向OS申请一大段内存,然后每次 malloc()时标记一小段为已分配,free()这一小段时再标成未分配。

    malloc/free的顺序一般是任意的,那么在多次malloc/free后分配和未分配会交替存在,如分配1 -- 未分配1 -- 分配2 -- 未分配2,即未分配内存是一个个"碎片"。

    内存碎片的坏处:

    • 额外占用内存: 即使未分配总量足够,仍然可能分不出连续内存,此时需要向OS申请更多

    • 影响cache: cache是以页为单位的,一页中的未分配部分一样要占用cache

    回复
    0
  • phpcn_u1582

    phpcn_u15822017-06-24 09:44:23

    最好的办法就是不用系统的默认进程堆。而是自己申请一个新的内存堆。一类的数据放在一个堆里。这适合频繁申请和释放的小段数据。
    也可以是自己先malloc一大块数据,再用自己的内存池来管理。
    前一种,Windows的文件管理器Explore有这么用。比如遍历的目录树结构,就是放在单独的堆里,一次HeapFree释放整个堆,而不需要一次次把叶子节点释放了。
    第二种,比如libjpeg自己就是有一个专门的内存池。

    回复
    0
  • 为情所困

    为情所困2017-06-24 09:44:23

    • 可以了解一下buddy algorithm

    • 还有这个PDF

    • 打不开就翻墙哦

    • 想了解下malloc实现就去看看dlmalloc的源码哦,不复杂

    回复
    0
  • 取消回复