问题标签 [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.
c++ - 在我的 C++ 项目中使用 tcmalloc
我在 linux 中将我的 C++ 程序链接到tcmalloc,并且我已经使用.-ltcmalloc_minimal
ltcmalloc
apt-get install libgoogle-perftools-dev
我是否需要将任何包含文件添加到我的项目源文件中才能在我的项目中启用 tcmalloc?tcmalloc 是否替换了我的项目使用的所有库中的所有 new/free/malloc?
code-coverage - 使用 GFLAGS 和 tcmalloc 的多重定义错误
在对项目代码进行代码覆盖时出现上述错误。没有代码覆盖,它的编译,但没有代码覆盖。使用的代码覆盖率库是-lgcov
.
c++ - TCMalloc 内存泄漏调试
我已经用 tcmalloc 编译了一个应用程序并使用 HEAPPROFILE 环境变量来获取堆文件
每 10MB 左右就会创建一个新的堆文件,根据 tcmalloc 页面,我可以使用 pprof 工具比较堆文件,并查看哪些是额外的未释放对象(可能泄漏)。
结果是:...总计:4600.7 MB
0x00000000009f1d25 是一个不错的地址,但我无法对这些数据做任何事情。
我尝试在 helloworld 应用程序中运行相同的程序
在这里我们可以清楚地看到,所有的函数都有明确的名称,并且泄漏来自 BigNumber 构造函数。
谁能指出我理解上述地址含义的正确方向?
c++ - TCMalloc - 获取指针的分配大小
使用 TCMalloc - 给定堆分配的对象,有没有办法获得对象的分配大小(仅表示 malloc 调用中传递的大小)?我要求一种“可靠”的方法(即,假设分配大小存储在指针之前,则不返回字长)
linker - 与 tcmalloc 链接或不链接时有什么区别
这是一个链接问题而不是 uwsgi 问题。但我会解释这个故事。
我正在使用 uwsgi 来托管我的烧瓶应用程序。在生产环境运行几周后,我发现我的应用程序有一些轻微的内存泄漏;uswgitop 报告的 RSS 大小正在增加。虽然这没什么大不了的,因为它只有 50MiB 到 60MiB 左右,但我想知道它为什么会增加。
经过一番工作,我发现这可能是由于 libc 中 malloc 实现的内存碎片。
所以我正在考虑使用以内存碎片管理而闻名的tcmalloc或jemalloc。
然后我就来自己搭建uwsgi了。它产生了以下链接命令。
从命令中可以看出,它显式链接到 tcmalloc,这是一个动态链接而不是静态链接。据我所知,tcmalloc 实现了标准的 posix malloc 接口,这也是为什么我们可以使用LD_PRELOAD
hook 到一个应用程序来替换它的 malloc 实现。
我的问题是:
为什么我们需要明确指定链接到 tcmalloc 时,我们可以使用LD_PRELOAD
这样做?
c++ - 使用 gperftools 的堆分析器来分析 libc malloc
我正在尝试分析应用程序以使用不同的分配策略比较其性能。
使用 tcmalloc 时我可以毫无问题地对其进行分析,但是如何使用 libc 的分配函数对其进行分析?实际上,启用 gperftool 的堆分析器需要使用-ltcmalloc
标志¹,但这会导致 tcmalloc 被用作分配策略。
glibc - tcmalloc 和 glibc 暴露的符号冲突
我最近在调试产品中的崩溃,并确定原因是 glibc 和 tcmalloc 暴露的内存分配符号冲突。我编写了以下示例代码来暴露此问题:
我使用以下命令编译它:
g++ temp.cpp -g -lresolv
我使用以下命令执行了程序:
LD_PRELOAD=/path/to/libtcmalloc_minimal.so.4 ./a.out
该程序因以下堆栈而崩溃:
#0 0x00007ffff6c7c875 in *__GI_raise (sig=) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x00007ffff6c7de51 在 *__GI_abort () at abort.c:92
#2 0x00007ffff6cbd8bf in __libc_message (do_abort=2, fmt=0x7ffff6d8c460 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/ libc_fatal.c:186
#3 0x00007ffff6cc30c8 in malloc_printerr (action=2, str=0x7ffff6d88fec "free(): invalid pointer", ptr=) at malloc.c:6282
#4 0x00007ffff6cc810c in *__GI___libc_free (mem=) at malloc.c:3733
#5 0x00007ffff6839e89 in _nss_dns_gethostbyname4_r (name=0x400814 "myserver", pat=0x7fffffffdfa8, buffer=0x7fffffffd9b0 "myserver.mydomain.com", buflen=1024, errnop=0x7fffffffdfbc, herrnop=0x7fffffffdf98, ttlp=0x0) at nss_dns/dns-host .c:341
#6 0x00007ffff6d11917 in gaih_inet (name=0x400814 "myserver", service=0x7fffffffdf88, req=0x7ffffffffe1d0, pai=0x7ffffffffe160, naddrs=0x7ffffffffe168) at ../sysdeps/posix/getaddrinfo.c:880
#7 0x00007ffff6d14301 in *__GI_getaddrinfo (name=0x400814 "myserver", service=0x0, hints=0x7ffffffffe1d0, pai=0x7ffffffffe200) at ../sysdeps/posix/getaddrinfo.c:2452
#8 0x00000000004006f0 在 main () at temp.cpp:12
原因是 from 调用的函数free()
是from ,而对应的函数是from调用的。tcmalloc 的地址和函数正在进入导致这次崩溃的 GOT。如果我不将我的程序链接到._nss_dns_gethostbyname4_r()
libnss_dns.so
libc.so
malloc()
libresolv.so
libtcmalloc_minimal.so
malloc()
free()
libresolv.so
libresolv.so
现在我的问题。是否有任何文档解释如何安全地使用 tcmalloc 来避免这样的崩溃?
c++ - 获取 malloc 之前(大致)有多少可用内存
我可以在 a 之前(大约)获得多少内存可用malloc()
?我需要在执行 a 之前调整一些内部变量,malloc()/new
因为执行 amalloc()
然后检查和删除是不可行的。
(仅供参考,我在询问 glibc 和 tcmalloc 的问题malloc()
,但任何其他malloc()
的也可以)
c++ - 在 CentOS 上安装 tcmalloc
我tcmalloc
使用以下命令在 CentOS 上安装:
并且它正确地进行。但我在 中找不到任何已安装的 perftools 库/usr/lib/
,因此无法设置LD_PRELOAD
变量。
然后,当我尝试用 flag 编译时-ltcmalloc
,编译器没有识别它,这很有意义。
我还应该指定tcmalloc
在 CentOS 上使用什么?谢谢。
gcc - tcmalloc 不会覆盖aligned_alloc?
刚刚加入了tcmalloc
2.7,但由于某种原因,我的 new 调用了aligned_alloc 仍然进入了 glibc。我在编译器选项中添加了以下内容,但-fno-builtin-memalign -fno-builtin-aligned_alloc -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -nostdlib
没有明显效果。
Ubuntu 18.04,库存 GCC,tcmalloc 2.7
难道我做错了什么?
EDIT001:由于某种原因,GCC
标志-flto=8
导致了这种行为,首先我怀疑--gc-sections
符号弄乱了,但事实证明这是错误的,不知何故有所-flto
不同。
如果有人知道为什么,欢迎您在这里解释