Linux给malloc()多少内存?
这是一个Linux系统问题,而不是编码问题。 当我使用“top”检查程序的内存使用情况时,它报告的值是内存分析器Valgrind的Massif给出的实际堆分配的3-4倍。 这是一个很大的程序,差别是数百兆字节。 Valgrind手册仅给出部分解释:
(Massif)不直接测量分配给较低级别系统调用(如mmap,mremap和brk)的内存。
诸如malloc之类的堆分配函数建立在这些系统调用之上。 例如,在需要时,分配器通常会调用mmap来分配一大块内存,然后将该块内存块交给客户机程序以响应对malloc等的调用。 Massif直接测量这些更高级别的malloc等调用,而不是较低级别的系统调用。
好,但是我真的从系统中获得了多少内存? 我需要能够在一台机器上运行尽可能多的程序实例,所以我需要知道有多少内存仍然可用。 页面对齐等无法解释报告的内存使用情况中数百兆字节的差异。
此外,什么决定了底层mmap()调用的块大小? 我看到一次大小为64MB的数据块,这看起来非常大。
任何malloc实现都将针对具有巨大内存需求的应用程序进行优化,因为低要求的应用程序无论如何都运行良好,虚拟内存也很便宜。
例如,你会发现malloc实现使用一个内存块来存储多达1024个malloc,最多16个字节,另一个块最多1024个malloc,最多32个字节,依此类推。 有几个malloc,这是低效率,但仍然便宜。 借助mallocs,它使malloc非常高效。
所以说“4倍”是完全没有意义的。 告诉我们比你想象的多了几兆字节。
链接地址: http://www.djcxy.com/p/82723.html