1

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 是否可能与这些协程函数不能很好地配合?

4

1 回答 1

0

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

于 2017-07-19T10:15:57.770 回答