繁体   English   中英

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

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

CentOS Linux版本7.3.1611

gcc版本4.8.5 20150623

gperftool 2.4-8.el7

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

2.如果我使用env HEAPCHECKER = NORMAL的 heap-checker运行程序,则内存每小时增加约50M,直到OOM杀手。

3.如果我使用带有env HEAPPROFILE =“ ./ hp” HEAP_PROFILE_ALLOCATION_INTERVAL = 100000000的堆配置文件,则内存每40分钟增加约100M并触发OOM。但是,当我使用pprof分析堆文件时,它会显示总内存仅为0.1MB,我预计为100M。

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

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

这两个程序之间的最大区别是,有错误的程序使用协程,我的意思是函数swapcontext,getcontext和makecontext。

我的问题是:

Q1。为什么当我设置HEAP_PROFILE_ALLOCATION_INTERVAL = 100000000时,由pprof打开的堆文件显示总内存为0.1M?

Q2。堆检查器或堆配置文件是否可能与那些协程函数配合不佳?

我假设您使用的是堆栈式协程,因此您一直在制作新的堆栈。 运行检查程序时,堆栈很可能不再被完全破坏/释放,因此它们实际上泄漏了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM