“TCMalloc目前不会将任何内存返回给系统。”的意思是什么?

3
http://goog-perftools.sourceforge.net/doc/tcmalloc.html中提到:“CMalloc目前不会将任何内存返回给系统。” 我猜这意味着如果我分配了42 MB并释放了它,系统就不会得到它,但下一次我分配47 MB时,它只会多占用5 MB?我的问题是:加载的dll或.so模块会发生什么情况。它们是否获得自己的内存块,直到程序退出才被释放。我问这个问题是因为如果我想编写运行时可更新的软件,我必须在不退出程序的情况下加载新的dll。所以我的问题是:如果我使用-ltcmalloc并且我不断地加载和卸载分配和释放内存的dll,那会导致内存使用量爆炸吗?我认为这是一个愚蠢的问题,但我不知道每个dll是否使用自己的内存分配方式,或者内存分配是按进程级别进行的。

我会谨慎使用tcmalloc。它的内存开销比“普通”malloc高得多,文档中的很多声明(如锁定的成本)似乎与现实脱节。除非您正在使用>2个核心(可能是8个或更多核心),并且将它们全部加载到malloc绑定代码中,否则我怀疑tcmalloc是否值得成本。 (而且被malloc绑定通常表明代码有问题...) - R.. GitHub STOP HELPING ICE
这是谷歌的代码,所以一定很好。但我认真怀疑他们是否在数字上撒谎了……如果你有一些高性能的malloc重代码,可以尝试并测试它(我目前没有)。 - NoSenseEtAl
他们声称在高端的Xeon上,锁定/解锁循环需要100纳秒,这一说法相当值得怀疑,因为在我使用的卑微的Atom上只需要不到一半的时间。至于基准测试,我认为它们总体上是正确且诚实的,但可能不相关,除非您的程序有大量线程(和大量内核)并且仅调用malloc - R.. GitHub STOP HELPING ICE
Xeon和Atom是完全不同的架构...也许核心数量会使锁定解锁变慢...再次声明,我不是硬件专家,但我理解你的观点。这类似于超频内存20%并获得2%更快的PC。在某些情况下,即使是魔术般的即时分配内存也无法显著提高性能。 - NoSenseEtAl
我敢说,如果在malloc上花费的时间成为瓶颈,那么你需要解决更大的设计问题。这可能意味着你的数据分散在许多小的单独分配的对象中,这种情况下,局部性丧失、缓存溢出甚至交换到磁盘都可能是更大的性能问题。这并不是说这不是一个现实世界的问题。一些面向对象的GUI应用程序(包括KDE)以制造数百万个小分配而闻名... - R.. GitHub STOP HELPING ICE
1个回答

3

内存属于进程,而不是DLL。因此,内存通常会一直保留到进程结束。这是大多数malloc实现的共同特点,不仅适用于您所询问的那个。


1
好的,很棒。我错了,我以为在普通实现中,free会将内存返回给操作系统。对于这个愚蠢的问题我道歉,但至少我希望读到这篇文章的人能学到一些东西。 - NoSenseEtAl
大多数 malloc 实现将立即将所有大块(>〜128k)返回给系统,并且还将在堆的顶部返回大的连续范围。我不认为 tcmalloc 会这样做,但它可能会执行前者。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接