我有一个应用程序正在执行内存使用情况分析。我正在使用一些数据加载应用程序,并且应用程序是这样的,它从这个抽取的数据中缓存(以某些哈希表和其他数据结构的形式存储,比如说一些记录)信息。对于存储在内存中的每条记录,应用程序使用malloc / calloc分配内存。在一定时间之后,大约80%的这些记录超时并且应用程序释放它为这些记录分配的内存。为了检查应用程序的内存使用情况,我在后台运行了一个脚本来捕获top和“free -m”的输出,并绘制一个图表来查看系统的内存使用情况,如下所示。该图显示了在“ - / + buffers / cache”行下“free -m”打印的值中使用的列和使用列的趋势。我期待使用的图形在开始时增加,然后随着应用程序释放内存而减少。但这不是实际情况。顶部输出的RES也不会减少。有人可以帮助我理解Linux下的应用程序的内存动态。
答案 0 :(得分:4)
malloc是一个库调用。如果它自己的内存池中没有内存,它将要求内核将更多内存与进程关联。
用于小缓冲区的malloc将使用其自己的池中的内存而free将将内存返回到此池,而不实际将其释放到系统中,除非池变得太大。
用于大缓冲区的malloc以完全不同的方式实现,将调用内核并因此会变慢,但是当释放这样的缓冲区时,它将立即释放。
http://linux.die.net/man/3/malloc
阅读那里的笔记。
答案 1 :(得分:2)
如果您确定没有内存泄漏,这可能是因为您的分配器保留了释放的内存。这可能有多种原因:
您的分配器可能预计将来会再次需要您释放的内存。这是尝试通过消除系统调用以满足下一个分配请求来减少分配内存的运行时开销。
您可能会遇到内存碎片问题。这意味着释放的内存驻留在仍包含尚未释放的对象的页面上,因此这些页面无法释放回系统。这使得程序看起来占用的内存比仍在使用的对象占用的内存占用的内存要多。
要查看您是否正在遭受后者而不是前者,请尝试分配一个对象,该对象大约是释放80%时释放的大小的一半。如果你的程序的大小增加了这个数量,那就意味着你释放的内存是碎片化的。