malloc 选项¶
https://blog.csdn.net/u013920085/article/details/52847464
1 mallopt¶
1.1 M_MMAP_THRESHOLD¶
- M_MMAP_THRESHOLD 用于设置 mmap 分配阈值,默认值为 128KB,ptmalloc 默认开启动态调整 mmap 分配阈值和 mmap 收缩阈值。
1.2 M_TRIM_THRESHOLD¶
M_TRIM_THRESHOLD 用于设置 mmap 收缩阈值,默认值为 128KB。自动收缩只会在 free 时才发生,如果当前 free 的 chunk 大小加上前后能合并 chunk 的大小大于 64KB,并且 top chunk 的大小达到 mmap 收缩阈值,对于主分配区,调用 malloc_trim() 返回一部分内存给操作系统,对于非主分配区,调用 heap_trim() 返回一部分内存给操作系统,在发生内存收缩时,还是从新设置 mmap 分配阈值和 mmap 收缩阈值。
这个选项一般与 M_MMAP_THRESHOLD 选项一起使用,M_MMAP_THRESHOLD 用于设置 mmap 分配阈值,对于长时间运行的程序,需要对这两个选项进行调优,尽量保证在 ptmalloc 中缓存的空闲 chunk 能够得到重用,尽量少用 mmap 分配临时用的内存。不停地使用系统调用 mmap 分配内存,然后很快又 free 掉该内存,这样是很浪费系统资源的,并且这样分配的内存的速度比从 ptmalloc 的空闲 chunk 中分配内存慢得多,由于需要页对齐导致空间利用率降低,并且操作系统调用 mmap() 分配内存是串行的,在发生缺页异常时加载新的物理页,需要对新的物理页做清 0 操作,大大影响效率。
M_TRIM_THRESHOLD 的值必须设置为页大小对齐,设置为 -1 会关闭内存收缩设置。
注意:试图在程序开始运行时分配一块大内存,并马上释放掉,以期望来触发内存收缩,这是不可能的,因为该内存马上就返回给操作系统了。
1.2.1 M_MMAP_MAX¶
M_MMAP_MAX 用于设置进程中用 mmap 分配的内存块的最大限制,默认值为 64K(cat /proc/sys/vm/max_map_count),因为有些系统用 mmap 分配的内存块太多会导致系统的性能下降。
如果将 M_MMAP_MAX 设置为 0,ptmalloc 将不会使用 mmap 分配大块内存。
Ptmalloc 为优化锁的竞争开销,做了 PER_THREAD 的优化,也提供了两个选项,M_ARENA_TEST 和 M_ARENA_MAX,由于 PER_THREAD 的优化默认没有开启,这里暂不对这两个选项做介绍。
另外,ptmalloc 没有提供关闭 mmap 分配阈值动态调整机制的选项,mmap 分配阈值动态调整时默认开启的,如果要关闭 mmap 分配阈值动态调整机制,可以设置 M_TRIM_THRESHOLD,M_MMAP_THRESHOLD,M_TOP_PAD 和 M_MMAP_MAX 中的任意一个。但是强烈建议不要关闭该机制,该机制保证了 ptmalloc 尽量重用缓存中的空闲内存,不用每次对相对大一些的内存使用系统调用 mmap 去分配内存。 - 示例
mallopt(M_MMAP_MAX, 0); // 禁止malloc调用mmap分配内存_**
mallopt(M_TRIM_THRESHOLD, 0); // 禁止内存缩进,sbrk申请的内存释放后不会归还给操作系统_**