我們有一個程序在長時間運行後由於內存不足而導致4Gb崩潰。該項目使用C++,openSuse11,12,包括鏈接到各種共享內存和其他庫。C++,是否泄漏?可以做些什麼
從PID的pmap監視堆增加和總內存增加,它們完全類似。這意味着該過程以2.5Gb和堆〜0開始,並在崩潰之前Total = 4 Gb
和heap = 1.5 Gb
。
我們用valgrind做了一些運行,結果令人費解。您可以在下面看到運行20分鐘的摘要。
==30042== HEAP SUMMARY:
==30042== in use at exit: 706,413 bytes in 3,345 blocks
==30042== total heap usage: 1,770,240 allocs, 1,766,895 frees, 173,813,303 bytes allocated
==30042== LEAK SUMMARY:
==30042== definitely lost: 96 bytes in 3 blocks
==30042== indirectly lost: 27 bytes in 3 blocks
==30042== possibly lost: 344 bytes in 2 blocks
==30042== still reachable: 705,946 bytes in 3,337 blocks
==30042== of which reachable via heuristic:
==30042== stdstring : 62 bytes in 2 blocks
==30042== suppressed: 0 bytes in 0 blocks
監測PMAP,我們知道,內存總量增加了130 Mb
但相較於Valgrind的報告中,我們可以看到有泄漏,但沒有真正貼近130 Mb
。
我們的問題:
有人可以幫助我瞭解Valgrind的總結,以及它如何涉及到
130 Mb
失去了什麼?這是泄漏與否?
- valgrind報告 裏面共享的內存是怎麼回事?
- 即使SM中有泄漏,難道它 還在堆中嗎?他們的大小在合理的水平。
- 我已經閱讀過各種資料,即使釋放內存與
delete[] or free()
系統仍然可能保留未來 使用的空間。如果是這樣的話,可以做些什麼?
*編輯這個堆的使用似乎是無限制的地方是,當該程序是一個服務器,使一個DB調用(固體SQL)連續大量的數據,其中分配了大量的空間。它不在共享內存中。我們看到釋放管理得當,可以做些什麼?
關於'free'的使用:當你使用malloc對象時,如果需要的話,你的程序向OS請求更多的內存頁面。你一直在閱讀的是'free'不會將這些頁面釋放回操作系統,而是讓它們保持在一起。這意味着當你再次請求更多內存時,程序不需要向操作系統請求更多頁面:它已經有了這些頁面。你的程序將覆蓋free'd內存中的舊數據,所以這不是實際的泄漏。 – CoconutBandit
它大部分是可到達的,這意味着指向它的變量不超出範圍或不被破壞。這意味着它可以合法使用內存。 – imreal
你在32位的環境? – imreal