操作系統資源回收問題——delete或者free釋放的內存會立即回收到操作系統嗎?


delete或者free釋放的內存會立即回收到操作系統嗎?

答案是大概率不會。

這是我在開發過程中遇到的一個問題:在機器人運行過程中,有時候需要從一個大地圖切換到更小的地圖。這個需求在代碼上的實現是析構掉運行大地圖時保存的數據,重新構造對象加載小地圖的數據。一開始因為不了解這個問題,期望的是切換小地圖后該進程占用的內存資源會有所下降,但是通過$top查看資源使用情況卻發現沒有下降,甚至稍微有點增加。

這個現象我們最直接的反應就是代碼中可能存在內存泄漏,對象析構后可能某些使用new分配資源沒有釋放。為此對代碼進行了檢查,並通過在那些主要申請資源的對象的析構函數中打印輸出來確認它們析構的執行。一番折騰還是發現不了問題所在。在確認各對象都的確被析構后,我們討論,這個問題是不是由系統造成的,也就是雖然資源被釋放了,但是沒有被系統回收。於是我們開始Google這個問題,找到如下相關結果(可能需要上外網,上不了可以看截圖):

  1. https://stackoverflow.com/questions/52417318/why-does-the-free-function-not-return-memory-to-the-operating-system/52417370

  2. https://lemire.me/blog/2020/03/03/calling-free-or-delete/

  3. http://www.cplusplus-soup.com/2010/01/freedelete-not-returning-memory-to-os.html?m=1

上面這些回答或者博客總結起來就是:

  • 內存(memory)是在堆(heap)上分配的。當進程 (process)請求內存時是向堆(堆管理器)請求內存,而堆又向操作系統(OS)申請內存。由於這種操作代價比較大,操作系統一般是分配給一塊(chunk)內存給堆,以減少內存操作(還是說系統調用)次數。因此進程調用delete或者free釋放資源后,這些資源歸還給了這個程序所申請到的堆,而堆不一定會將資源歸還給操作系統(取決於操作系統類型、內存塊的大小等因素)。這部分沒有歸還的資源在當前進程再次(使用new或malloc)申請內存時可以被重用,因此這樣可以避免頻繁與操作系統進行“內存交互”。這些釋放的資源在進程結束后隨着整個堆一起歸還給OS。當然,如果想要強制回收資源也是有路子的,如博客中所說可以嘗試malloc_trim。

以上是我對“操作系統資源回收”問題的研究和總結,歡迎交流討論。
如果錯誤或不當之處,歡迎指教。
如果對你有幫助,可以給個贊表示鼓勵:D。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM