malloc如何分配内存
方法
malloc 申请内存的时候,会有两种方式向操作系统申请堆内存。
- 如果小于128kb,就会通过 brk() 系统调用从堆分配内存,因为使用mmap()涉及到了系统调用,分配内存时,应该尽量避免系统调用,并且malloc 通过 brk() 系统调用在堆空间申请内存的时候,由于堆空间是连续的,所以直接预分配更大的内存来作为内存池,当使用free()内存释放的时候,就缓存在内存池中,以便下次使用;
- 大于128kb的,就会通过 mmap() 系统调用在文件映射区域分配内存,这主要是为了解决在使用brk()进行内存分配时,对于一些小块内存,随着不断地创建和释放,堆内会产生越来越多不可用的碎片,导致"内存泄露”。而这种“泄露“现象使用 valgrind 是无法检测出来的。
注意:
- malloc() 在分配内存的时候,会预分配更大的空间作为内存池。
- malloc() 分配的实际上是虚拟内存,如果分配后的虚拟内存没有被访问的话,虚拟内存是不会映射到物理内存的,这样就不会占用物理内存了。只有在访问已分配的虚拟地址空间的时候,操作系统通过查找页表,发现虚拟内存对应的页没有在物理内存中,就会触发缺页中断,然后操作系统会建立虚拟内存和物理内存之间的映射关系。