gpt4 book ai didi

c++ - tcmalloc 的碎片

转载 作者:太空狗 更新时间:2023-10-29 21:46:19 28 4
gpt4 key购买 nike

我们的软件实现了一个 Actor 模型系统,我们经常分配/释放小对象。我非常确定每个对象都被销毁而不会发生内存泄漏。 (我已经使用 valgrind 和 tcmalloc 工具检查了我的软件中的内存泄漏。没有发现泄漏。)

当我们更改为使用tcmalloc 来替换glibc 中的malloc 时,我们发现内存不断增加,直到进程被OOM(Out of Memory) 杀死。然后我们发现 glibc 也有同样的问题,但增长速度低于 tcmalloc。

我使用了 malloc_stats() 来显示内存信息

第一次执行后(top show 0.96G)'


  • MALLOC:960110592 (915.6 MB) 堆大小
  • MALLOC:15886016 ( 15.2 MB) 字节被应用程序使用
  • MALLOC:907419648 (865.4 MB) 页堆中的空闲字节数
  • MALLOC:0 ( 0.0 MB) 个字节在页堆中未映射
  • MALLOC:中央缓存中有 27121208 ( 25.9 MB) 个空闲字节
  • MALLOC:传输缓存中有 151040 ( 0.1 MB) 个空闲字节
  • MALLOC:9532680 ( 9.1 MB) 字节在线程缓存中空闲
  • MALLOC:14275 个跨度正在使用
  • MALLOC:正在使用 27 个线程堆
  • MALLOC:7602176 ( 7.2 MB) 元数据已分配

第 5 次执行后(顶部显示 1.2G)

  • MALLOC:1173131264 (1118.8 MB) 堆大小
  • MALLOC:18001048 (17.2 MB) 个字节被应用程序使用
  • MALLOC:1082458112 (1032.3 MB) 页堆中的空闲字节数
  • MALLOC:21168128 ( 20.2 MB) 字节在页堆中未映射
  • MALLOC:中央缓存中有 37992328 ( 36.2 MB) 个空闲字节
  • MALLOC:传输缓存中有 252928 ( 0.2 MB) 个空闲字节
  • MALLOC:线程缓存中有 13258720 (12.6 MB) 个空闲字节
  • MALLOC:17651 个跨度正在使用
  • MALLOC:正在使用 27 个线程堆
  • MALLOC:8126464 ( 7.8 MB) 元数据已分配

从这样的数据我们可以看出。在第 5 次相同的行为之后,我们的软件中仅使用 17.2。但是 tcmalloc 持有 1.1G 内存而不返回系统。当然,tcmalloc 持有那些内存并不重要。但是当我们的程序被OOM杀死时(实际使用的内存小于1G),它会不断增加。

我们怀疑是不是和堆碎片有关。任何人有一些经验可以与我们分享?我想我的情况和 https://bugzilla.redhat.com/show_bug.cgi?id=843478

非常感谢。

最佳答案

我建议使用 Boehm's conservative GC并在您的应用程序中使用 GC_MALLOCGC_MALLOC_ATOMIC 而不是 malloc (以及 GC_FREE 而不是 free,但你甚至可以避免任何明确的 free-ing,GC 会执行它们)。或者也许使用 valgrind (使用系统 Glibc malloc)查找内存泄漏。如果使用 Boehm 的 GC,请不要忘记显式清除分配的内存区域。

最好确保您的许多小对象具有粗粒度。例如。分配 8、12 或 16 个字的对象,而不是 8、9、10、11、12、13、14、15 或 16 个字的对象...例如,您可能只分配大小为 2 或 3 的幂的区域乘以 2 的幂。

此外,不要忘记您可以使用 setrlimit(2) 来限制内存空间。 ,例如使用在您的终端中运行的 bash 内置的 ulimit。这应该可以简化测试。此外,也许使用 pmap/proc/$(pidof yourapp)/maps 可以帮助您了解所使用的地址空间。

附言。 Boehm GC 和任何类型的 malloc(包括 tcmalloc 或 Glibc malloc)都无法解决内存碎片问题。如果您怀疑存在碎片,则必须在地址空间中移动内存区域(即您可能想要编写自己的精确、复制、分代 GC 或重新使用一些现有的 GC)。

关于c++ - tcmalloc 的碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15566083/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com