CentOS Linux版本7.3.1611
gcc版本4.8.5 20150623
gperftool 2.4-8.el7
1.my c ++程序链接-ltcmalloc在没有HEAPCHECKER或HEAPPROFILE的情况下正常工作。它使用的记忆稳定在5M~10M。
2.如果我使用带有 env HEAPCHECKER = NORMAL 的堆检查程序运行程序,则内存每小时增加约50M,直到OOM杀手。
3.如果我使用 env HEAPPROFILE =“./ hp”HEAP_PROFILE_ALLOCATION_INTERVAL = 100000000 的堆配置文件,内存每40分钟增加约100M并且还会触发OOM。但是,当我使用时pprof来分析堆文件,它显示总内存只有0.1MB,我期待100M。
我知道堆检查器和堆配置文件会导致额外的内存使用,因为他们需要记录一些其他信息来跟踪内存分配,但我不认为这是我的理由。
我使用堆检查器和堆配置文件与另一个小程序,这非常好。
这两个程序的最大区别在于,错误的程序使用了coroutine,我的意思是函数swapcontext,getcontext和makecontext。
我的问题是:
Q1。当我设置HEAP_PROFILE_ALLOCATION_INTERVAL = 100000000时,为什么pprof打开的堆文件显示总内存为0.1M?
问题2.堆检查器或堆配置文件是否可能与这些协程功能不能很好地配合?
答案 0 :(得分:0)
我假设您正在使用堆栈协程,因此您不断创建新堆栈。当您运行检查器时,堆栈不再完全被破坏/释放,因此它们实际上会泄漏。