问题标签 [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.
memory-leaks - tcmalloc 不生成堆栈跟踪
我正在运行一个与 tcmalloc 链接的二进制文件,它没有为它正在检测的泄漏生成堆栈跟踪。
当我运行 pprof 时,我收到一条消息,指出没有要打印的节点。
我附上了可疑内存泄漏的代码
关于如何调试的任何想法?
c++ - 64 位 NoBarrier_Store() 未在此平台上实现
“此平台上未实现 64 位 NoBarrier_Store()” 我在 win7 上使用 tcmalloc 和 vs2005。我的应用程序中有两个线程,一个执行 malloc(),另一个执行 free()。当我的应用程序启动时,tcmalloc 会打印这个。调试后,我发现以下函数无法在 _WIN32 上运行,
我想知道如何在win32上避免这种情况。非常感谢。
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:
performance - 我应该使用 tcmalloc/jemalloc 替换内存池吗?
在我的项目中,我使用了内存池(boost::pool),但是它占用了太多内存(实测 22G),所以我想使用 tcmalloc/jemalloc 替换内存池,我考虑以下方面:
我想如果我使用 tcmalloc/jemalloc 替换池,那么使用的内存会更小,但是会出现性能问题。我该如何解决?谢谢!
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一样
非常感谢。
c++ - 来自 tcmalloc 的意外行为
我已经在一个大型项目中使用 tcmalloc 几个月了,到目前为止,我必须说我对它非常满意,最重要的是它的 HeapProfiling 功能允许跟踪内存泄漏并删除它们。
在过去的几周里,虽然我们在应用程序中遇到了随机崩溃,但我们找不到随机崩溃的根源。在一个非常特殊的情况下,当应用程序崩溃时,我们发现自己的某个应用程序线程的堆栈完全损坏。有几次我发现线程卡在 tcmalloc::PageHeap::AllocLarge() 中,但由于我没有链接 tcmalloc 的调试符号,我无法理解问题所在。
经过近一周的调查,今天我尝试了最简单的事情:从链接中删除tcmalloc以避免使用它,只是为了看看发生了什么。嗯...我终于发现了问题所在,并且有问题的代码看起来很像这样:
使用 libc 应用程序仍然崩溃,但我终于看到我正在对分配在堆栈上的对象调用 delete。
我仍然无法弄清楚为什么 tcmalloc 会保持应用程序运行,而不管这种非常危险(如果不是完全错误)的对象释放,以及当 AllocatingFunction 结束时 object_on_stack 超出范围时的双重释放。事实是,可以重复调用有问题的代码,而没有任何潜在可憎的暗示。
我知道如果使用不当,内存释放是那些“未定义的行为”之一,但令我惊讶的是“标准”libc 和 tcmalloc 之间的行为如此不同。
有没有人对为什么 tcmalloc 保持应用程序运行有某种洞察力的解释?
提前致谢 :)
祝你今天过得愉快
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 时使用)但没有运气
任何帮助是极大的赞赏。
c - 将 tcmalloc/jemalloc 与自定义内存池管理器一起使用
我想使用高性能通用分配器,例如jemalloc
/tcmalloc
与内存池。有这样做的指南吗?我不想使用jemalloc
/tcmalloc
作为malloc
.
我有一个内存池,它使用libarena
并划分了一个较大的内存区域(2GB)。我想gslice
在这个舞台上创建固定大小的对象池,比如 1 GB。(如 Bonwick 平板分配器)并希望将剩余的内存用于可变大小的通用分配。我想拥有jemalloc
/tcmalloc
使用这个内存区域。这可能吗?关于如何进行的任何想法?如果有备用库,我也想听听。
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 代码。
更新我还注意到,当线程数量增加/减少时,每个线程的缓存没有改变。它是增长的页堆。
c++ - tcmalloc ReleaseFreeMemory() 没有正确释放内存
我在我的一个应用程序中使用 tcmalloc,其中堆的增长和收缩量非常大,显然我遇到了 tcmalloc 没有将内存释放回操作系统的问题。现在我尝试使用 api 来做到这一点MallocExtension::instance()->ReleaseFreeMemory();
。它工作正常并释放了内存。但是当我在一段时间后(比如 5 分钟)让我的进程继续运行时,内存仍在增加到初始水平(有时更多)。奇怪的是应用程序是空闲的。
这是我的代码
感谢任何帮助。