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。
我知道 heap-checker 和 heap-profile 会导致额外的内存使用,因为它们需要记录一些其他信息来跟踪内存分配,但我认为这不是我的情况的原因。
我将 heap-checker 和 heap-profile 与另一个小程序一起使用,效果很好。
这两个程序最大的区别是,故障程序使用协程,我的意思是函数swapcontext、getcontext和makecontext。
我的问题是:
Q1.为什么我设置HEAP_PROFILE_ALLOCATION_INTERVAL=100000000时pprof打开的堆文件显示总内存为0.1M?
Q2. heap-checker 或 heap-profile 是否可能与这些协程函数不能很好地配合?