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