问题标签 [tcmalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1340 浏览

memory-leaks - tcmalloc 不生成堆栈跟踪

我正在运行一个与 tcmalloc 链接的二进制文件,它没有为它正在检测的泄漏生成堆栈跟踪。

当我运行 pprof 时,我收到一条消息,指出没有要打印的节点。

我附上了可疑内存泄漏的代码

关于如何调试的任何想法?

0 投票
1 回答
377 浏览

c++ - 64 位 NoBarrier_Store() 未在此平台上实现

“此平台上未实现 64 位 NoBarrier_Store()” 我在 win7 上使用 tcmalloc 和 vs2005。我的应用程序中有两个线程,一个执行 malloc(),另一个执行 free()。当我的应用程序启动时,tcmalloc 会打印这个。调试后,我发现以下函数无法在 _WIN32 上运行,

我想知道如何在win32上避免这种情况。非常感谢。

0 投票
2 回答
5231 浏览

c++ - 有没有人能够在使用共享 DLL 的 Windows 64 位应用程序上集成 tcmalloc?

我有一个 64 位 Visual Studio 2010(单线程)C++ Windows 应用程序,我正在尝试将 tcmalloc 与之集成,并且在使用我们的任何动态链接的 dll 时遇到问题。我将 tcmalloc 链接为静态库。在应用程序开始使用我们共享的 dll 之一之前,tcmalloc 工作得很好。我将解决方案构建为 64 位调试应用程序。所有 dll 与 CRT 库的 C/C++ 调试版本(MSVCP100D.dll 和 MVCR100D.dll)的链接。

下面是失败的代码示例。tcmalloc 被调用来分配所有的内存,但是当 delete 被调用时,应用程序崩溃了。我真的很困惑,因为当我在主可执行文件中创建一个函数并将代码复制到那里时,完全相同的代码可以正常工作。

如果有人对在这种情况下使用 tcmalloc 有任何经验,我将不胜感激您的反馈。这对我来说是个谜。它是 dll 的内存模型问题(不同的堆??)?我不知道。在我看来,他们使用的是同一个堆。

对不起,如果这篇文章太长。我试图提供尽可能多的信息。

谢谢你。

布鲁斯

更新:作为测试,我将崩溃的共享 dll 更改为静态库,并且一切正常,直到应用程序使用不同的 dll。因此,无论出于何种原因,tcmalloc 都需要一些额外的步骤来处理共享 dll。我可以使用 tcmalloc 制作我们所有的 dll 的静态库来进行内存分析,但如果知道还需要做什么才能将共享 dll 与 tcmalloc 一起使用,那真的很高兴。

DLL 头文件方法声明:__declspec(dllexport) static std::string GetExecutablePath();

//.cpp 实现

临时字符串销毁时调用的方法:

在将 tcmalloc 重建为共享 DLL 后,它现在在尝试释放内存时会在不同的地方崩溃。

afxmem.cpp:

dbgheap.c:

0 投票
0 回答
766 浏览

performance - 我应该使用 tcmalloc/jemalloc 替换内存池吗?

在我的项目中,我使用了内存池(boost::pool),但是它占用了太多内存(实测 22G),所以我想使用 tcmalloc/jemalloc 替换内存池,我考虑以下方面:

我想如果我使用 tcmalloc/jemalloc 替换池,那么使用的内存会更小,但是会出现性能问题。我该如何解决?谢谢!

0 投票
2 回答
4895 浏览

c++ - tcmalloc 的分片

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

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

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

首次执行后(顶部显示 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一样

非常感谢。

0 投票
2 回答
1433 浏览

c++ - 来自 tcmalloc 的意外行为

我已经在一个大型项目中使用 tcmalloc 几个月了,到目前为止,我必须说我对它非常满意,最重要的是它的 HeapProfiling 功能允许跟踪内存泄漏并删除它们。

在过去的几周里,虽然我们在应用程序中遇到了随机崩溃,但我们找不到随机崩溃的根源。在一个非常特殊的情况下,当应用程序崩溃时,我们发现自己的某个应用程序线程的堆栈完全损坏。有几次我发现线程卡在 tcmalloc::PageHeap::AllocLarge() 中,但由于我没有链接 tcmalloc 的调试符号,我无法理解问题所在。

经过近一周的调查,今天我尝试了最简单的事情:从链接中删除tcmalloc以避免使用它,只是为了看看发生了什么。嗯...我终于发现了问题所在,并且有问题的代码看起来很像这样:

使用 libc 应用程序仍然崩溃,但我终于看到我正在对分配在堆栈上的对象调用 delete。

我仍然无法弄清楚为什么 tcmalloc 会保持应用程序运行,而不管这种非常危险(如果不是完全错误)的对象释放,以及当 AllocatingFunction 结束时 object_on_stack 超出范围时的双重释放。事实是,可以重复调用有问题的代码,而没有任何潜在可憎的暗示。

我知道如果使用不当,内存释放是那些“未定义的行为”之一,但令我惊讶的是“标准”libc 和 tcmalloc 之间的行为如此不同。

有没有人对为什么 tcmalloc 保持应用程序运行有某种洞察力的解释?

提前致谢 :)

祝你今天过得愉快

0 投票
1 回答
261 浏览

heap-memory - TCMalloc:在 Win-64 上修补的删除和删除 [] 运算符

TCMalloc 是一个非常适合多线程使用的堆管理器(在我的例子中是 OpenMP)。使用 tcmalloc 启动并运行 linux、windows、32 位的所有内容非常容易,但现在我完全被 win-64 卡住了:

  • 我使用 VS2012 构建的动态链接 x64 libtcmalloc-minimal
  • 一切都链接得很好,程序启动得很好,{ new, malloc, realloc, free } 工作得很好
  • 第一次调用 delete 或 delete [] 时,程序崩溃,因为 std 库(在 dbgdel.cpp 中)中的 delete 运算符在以下行中被调用:

    _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

  • 我尝试使用所有内容的发布版本(因为 dbgdel.cpp 运算符仅在定义 _DEBUG 时使用)但没有运气

任何帮助是极大的赞赏。

0 投票
1 回答
2787 浏览

c - 将 tcmalloc/jemalloc 与自定义内存池管理器一起使用

我想使用高性能通用分配器,例如jemalloc/tcmalloc与内存池。有这样做的指南吗?我不想使用jemalloc/tcmalloc作为malloc.

我有一个内存池,它使用libarena并划分了一个较大的内存区域(2GB)。我想gslice在这个舞台上创建固定大小的对象池,比如 1 GB。(如 Bonwick 平板分配器)并希望将剩余的内存用于可变大小的通用分配。我想拥有jemalloc/tcmalloc使用这个内存区域。这可能吗?关于如何进行的任何想法?如果有备用库,我也想听听。

0 投票
0 回答
784 浏览

c++ - 解释 tcmalloc 的 MALLOCSTATS 输出

我正在尝试解决使用 tcmalloc 的多线程应用程序的性能问题。每个线程都会创建大量对象,我的分析是 tcmalloc 中的线程缓存无法分配内存,并且经常尝试从中央页堆中获取内存。这是我的应用程序的输出,其中MALLOCSTATS=2 用于 4 个线程。

255 个大 * 15 个跨度 ~ 706.3 MiB;713.5 MiB 暨;未映射:0.0 MiB;0.0 MiB 暨

现在我真的不明白这是否表明哪些线程缓存正在耗尽。我对线程缓存耗尽的分析是基于观察在 GDB 下运行的程序并解释调用 futex 系统调用的 tcmalloc 代码。

更新我还注意到,当线程数量增加/减少时,每个线程的缓存没有改变。它是增长的页堆。

0 投票
1 回答
5219 浏览

c++ - tcmalloc ReleaseFreeMemory() 没有正确释放内存

我在我的一个应用程序中使用 tcmalloc,其中堆的增长和收缩量非常大,显然我遇到了 tcmalloc 没有将内存释放回操作系统的问题。现在我尝试使用 api 来做到这一点MallocExtension::instance()->ReleaseFreeMemory();。它工作正常并释放了内存。但是当我在一段时间后(比如 5 分钟)让我的进程继续运行时,内存仍在增加到初始水平(有时更多)。奇怪的是应用程序是空闲的。

这是我的代码

感谢任何帮助。