2017-07-05 10 views
1

的CentOS Linux的時候使用顯著內存中釋放1611年7月3日爲什麼我的C++程序做tcmalloc堆檢查或堆輪廓

gcc版本4.8.5 20150623

gperftool 2.4-8.el7

1.my C++程序哪些鏈接-ltcmalloc工作正常,沒有HEAPCHECKER或HEAPPROFILE。它使用的內存穩定在5M〜10M。

2.if我使用堆檢查器運行程序env HEAPCHECKER = NORMAL,內存每小時增加大約50M,直到OOM殺手。

3,如果我用堆形輪廓與ENV HEAPPROFILE =「./馬力」 HEAP_PROFILE_ALLOCATION_INTERVAL =億,存儲器增加約100M每40分鐘,並且還OOM是triggered.However,當我使用pprof到分析堆文件,它顯示的總內存只有0.1MB,我期望100M。

我知道堆檢查和堆配置文件會導致額外的內存使用,因爲他們需要記錄一些其他信息來跟蹤內存分配,但我不認爲這是我的情況的原因。

我使用堆檢查器和堆配置文件與另一個小程序,它工作得很好。

這兩個程序最大的區別在於,錯誤的程序使用協程,我的意思是函數swapcontext,getcontext和makecontext。

我的問題是:

Q1.Why並通過pprof打開堆文件顯示總內存爲0.1M,當我設置HEAP_PROFILE_ALLOCATION_INTERVAL =億?

問題2.堆檢查器或堆配置文件可能與那些協程函數不協調嗎?

回答

0

我假設你使用堆棧協程,所以你一直在創建新的堆棧。當你運行檢查器時,堆棧可能不再被完全破壞/釋放,因此它們實際上會泄漏。