glibc (ptmalloc 内存 暴增 问题

  
        

直接 上 代码 :

#include < stdio.h >

#include < stdlib.h >

#include < string.h >

int main ()

{

int alloc_time = 4000;

char * a [alloc_time];

char * b [ ,null,null,3],alloc_time];

int i, j;

para (i = 0; i < alloc_time; i ++)

{

a [i] = (char *) malloc (52722 ; ;

memset (a [i], 1, 52722 ;

b [i] = (char *) malloc (1) ;

memset (b [i], 1, 1) ;

}

printf ( " malloc terminó \\ n ") ;

para (i = alloc_time-1; i > = 0; i--)

{

free (a [i]) ;

free (b [i]) ;

}

printf free " acabado libre \\ n ") ;

//char * p = (char *) malloc (2000) ;

//free (p) ;

mientras que (1) {

duerme (3) ;

}

}

这个 测试 , , 发现 Glibc 内存 暴增 ,程序 已经 把 内存 返回 Glibc , , 但 Glibc : : 的 的 m m m m m m m m m m都会 马上 给 ,, ptmalloc heap mmap 的 空闲 空闲 空闲的 , 的 开销 的 的 unk B 三个 的 的 容器 中。

contenedores: ptmalloc 大小 的 的 unk 的 unk 一个 一个的 (pequeños contenedores) , 每隔 8 个 的 块 , 的512 的 都 的 队列 的 的 unk 的。 的。 的一个 一个 队列 , 它 一个 caché, 的 的 的 进入 ache ache 的 的 的 的给 用户 , 否则 将 bin sin clasificar 所有 trozos 放入 bandejas 中。

fastbins, 10 个 定 长 , , 它 一个 , 的 所有 的 并且0B ch 的 unk 的 unk unk的 , 的 一个和 第 6 个 字)。

malloc 的 步骤 : : p b fastbins 找 , 如果 能 , 从1 立刻 返回 <

2. 的 块 是否<

3. 这 , 说明 的 是 一块 , 的 的 chunk; ch , ate consolidate, ptmalloc 首先 触发 fastbins 中 的 chunk, 将的 chunk 合并 , 并 链接 到 contenedor sin clasificar 中 找 一都要 切割 , 所以 优先 , 避免 碎片

4. 的 unsort bin 取出 一个 chunk, 能 找到 想要 的 unk 的 unk 的 的 chunk, ch ch , , 如果 , 如果的 chunk 大小 的 chunk, 它 bins 的 队列 中 , , 2.

5. 了 , 说明 的 是 的 内存 的 的 内存 的 内存 的 内存contenedor no clasificado ch 找不到 合适 的 trozo, 并且 fastbins bin contenedor no clasificado ch 的 trozo 干净 contenedores grandes 的 , 的 能 的 能 符合 需求 的 unk 的 unk , ,还能 建 一个 一个 一个 一个 一个 一个 部分 部分的 chunk, 就 需要 topchunk 的 一个 的parte superior trozo, 然后 返回 内存 地址 ;

7. 了 这 一步 topchunk , 就 调用 sysalloc, 就是 , 然后的 步骤 :

1. 判断 所需 释放 的 unk 是否 ch ap

2. 和 和 topchunk 相邻 , 直接 和 topchunk 合并 , 不会 的 空闲 , , 然后 返回 ;

3. 释放 的 大小 小于 大小 的 大小 小于 小于 小于 的 的 的, 就把 它 挂 到 fastbins , 使用 位 仍然 为 1, , ,

6. 下 一个 chunk 处在 使用 , 的 , 则 合并 , 并将 合并 后 的 unk 的 unk ort ort ort ort ort

7. ch 到 到 了 , 说明 了 一个 一个 parte superior 的 的 的

8. 合并 后 的 大小 大于 FASTBIN_CONSOLIDATION_THRESHOLD (64K , , 也会 consolidate, 即 fastbins 的 合并 操作 , 合并 的 的 unk 的 unk 的 unk 的 的之后 转 下一步 ;

9. topchunk 的 大小 mmap 的 收缩 , 128KB)

ptmalloc 128K 的 通过 mmap 方式 来小于 , K 128K (mmap 的 块 的 的 unk 的 的, 的 空闲 的 的 的 的 的 的 的 的 的 的的 一个程序 , 内存 , 的 时候 , 的 的 的的 块 , 的, 的 块 , 的 小块 b fastbins , , 使用, 1, unsort 队列 的 的 的 的 的 的 的的 的 , Fastbins 的 成为 , 的 块 ,远 小于 64K, 堆 ,

Copyright © Conocimiento de Windows All Rights Reserved