mallopt() 的可调参数
- M_TRIM_THRESHOLD: 引起内存管理系统通过调用 brk() 来缩小数据段的最小释放内存块的大小。实际上,正如文章中提到的,为了尽量减少系统调用的次数,释放的数据不会立即返回给系统。此参数指定在执行此类调用之前必须释放多少内存。trim threshold 的值会影响系统的性能。如果该值太高,则会保留更多内存,并且系统更可能求助于缓慢的交换空间访问。相反,非常小的值会因为频繁的 brk() 调用而降低整体性能。此参数在长时间运行的程序中至关重要,因为过高的值可能会耗尽系统的大量内存。此外,需要指出的是,即使“锁定”的块(在文章中解释的意义上)的大小大于此阈值,也不能将其返回给系统——这就是 mmap() 分配的用途。清单 1 中显示的程序将阈值设置为作为参数传递的值,然后分配和释放 100KB 的内存。您可以在清单 2 中观察结果。
- M_TOP_PAD: 每次调用 brk() 来扩展(缩小)堆时,应分配(保留)多少空闲空间。当执行需要调用 brk() 的 malloc() 时,会向系统请求此额外的空间量。相反,在触发负 brk() 的 free() 调用时,库会保留此额外的空间量以供将来使用。当您的程序执行大量后续的 malloc() 和 free() 时,可以考虑将此参数设置为优化的值,这可能会导致大量的 brk() 调用。
- M_MMAP_THRESHOLD: 对于大于此阈值的块的任何内存请求,都将通过调用 mmap() 而不是 brk() 来提供服务。正如已经提到的,这种方法的主要优点是,一旦释放,此块占用的内存会立即提供给系统,并且不会像从 brk() 获得的内存那样被保留,直到满足 trim threshold。为此参数使用较低的值,从而增加 mmap() 与 brk() 的发生频率,其优点是可以减少锁定的块的数量。缺点是 mmap() 在提供内存方面通常比 brk() 慢,因此通常更安全的是保持此参数的默认值不变。
- M_MMAP_MAX: 可以同时从 mmap() 提供的最大内存块数量。此参数与对最大未完成 mmap() 数量有限制的系统相关。通常可以保持此值不变。
- M_MXFAST: 使用称为fastbins的优化内存容器来提供服务的请求块的最大大小。 我们这里没有空间来处理内部细节,但您需要知道的是,当您分配和释放大量相同大小的小块时,fastbins 是高效的。无论如何,由于 fastbins 从不合并(也就是说,两个相邻的空闲 fastbins 永远不会合并成一个更大的空闲块),它们的使用会增加内存碎片和程序的整体内存占用。因此,此参数的值必须在速度增益(较小的 fastbins)和引起的碎片(较大的 fastbins)之间进行权衡。通常较小的值更好,因为 GNU C 库经过优化,使得较大的 fastbins 会导致大量的碎片,而不会产生明显的加速。 GNU C 库在版本 2.3 中进行了 malloc 例程的完整重写,并引入了 Fastbin 支持。
© . All rights reserved.