为什么我的 C++ 程序在执行 TCMALLOC 堆检查器或堆配置文件时使用大量内存

why my c++ program uses significant memory when doing tcmalloc heap-checker or heap-profile

本文关键字:配置文件 内存 检查 程序 C++ 我的 执行 为什么 TCMALLOC      更新时间:2023-10-16

CentOS Linux Release 7.3.1611

GCC 版本 4.8.5 20150623

Gperftool 2.4-8.el7

链接 -ltcmalloc 的 1.my c++ 程序在没有 HEAPCHECKER 或 HEAPPROFILE 的情况下工作正常。它使用的内存稳定在5M~10M。

2.如果我使用堆检查器运行程序,环境堆检查器=正常,内存每小时增加约50M,直到OOM杀手。

3.如果我使用堆配置文件与env HEAPPROFILE="./hp" HEAP_PROFILE_ALLOCATION_INTERVAL=100000000,内存每 40 分钟增加约 100M,并且还会触发 OOM。但是,当我使用 pprof 分析堆文件时,它显示总内存仅为 0.1MB,而我期望为 100M。

我知道堆检查器和堆配置文件会导致额外的内存使用,因为它们需要记录一些其他信息来跟踪内存分配,但我认为这不是我的情况的原因。

我将堆检查器和堆配置文件与另一个小程序一起使用,效果很好。

这两个程序之间最大的区别是,有缺陷的程序使用协程,我的意思是函数交换上下文,getcontext和makecontext。

我的问题是:

问题 1.为什么当我设置 HEAP_PROFILE_ALLOCATION_INTERVAL=1000000000 时,pprof 打开的堆文件显示总内存为 0.1M?

堆检查器或堆配置文件 Q2.Is 可能不能很好地与这些协程函数配合使用?

我假设您正在使用堆栈协程,因此您一直在创建新堆栈。很可能是当您运行检查器时,堆栈不再完全破坏/释放,因此它们实际上会泄漏。