Skip to main content

Malloc 内存分配

小于 特定阈值 时,malloc 使用 brk 在堆上分配内存。

int main() {
printf("使用cat /proc/%d/maps查看内存分配\n", getpid());

// 申请1字节的内存
void *addr = malloc(1);
printf("此1字节的内存起始地址:%x\n", addr);
printf("使用cat /proc/%d/maps查看内存分配\n", getpid());

// 将程序阻塞,当输入任意字符时才往下执行
getchar();

// 释放内存
free(addr);
printf("释放了1字节的内存,但heap堆并不会释放\n");

getchar();
return 0;
}

使用 brk 分配时,free 之后不会释放内存,而是缓存在 malloc 的内存池中,待下次使用。

大于 特定阈值 时,malloc 使用 mmap 在堆上分配内存。

int main() {
// 申请1字节的内存
void *addr = malloc(256 * 1024);
printf("此256KB字节的内存起始地址:%x\n", addr);
printf("使用cat /proc/%d/maps查看内存分配\n", getpid());

// 将程序阻塞,当输入任意字符时才往下执行
getchar();

// 释放内存
free(addr);
printf("释放了256KB字节的内存,内存也归还给了操作系统\n");

getchar();
return 0;
}

使用 mmap 分配时,free 之后即释放内存。

为什么不完全使用 mmap 来分配内存

因为向操作系统申请内存,需要通过系统调用,执行系统调用需要进入内核态,频繁的切换内核态和用户态十分耗时。

那么,为什么不完全使用 brk 来分配内存

brk 会产生越来越多不可用的碎片。