窺探記憶體管理

2021-05-26 11:28:01 字數 1787 閱讀 6172

關於記憶體的問題是乙個很初級的問題也是乙個很高深的問題,確切的說是個入門必須了解的問題也是很有內涵的問題。如何認識記憶體,使用記憶體,管理記憶體是乙個一直貫穿於編碼過程的核心問題。拋棄所有的架構概念,剝離覆蓋在軟體開發的迷霧,程式本身只是乙個記憶體中資料不斷的遷移與cpu計算器不斷進行數值運算的過程。一層層的高階語言和軟體工程是將這個複雜過程的更加條理和有序的去組織,去除了「重複製造車輪」的煩惱。但是記憶體的問題本身是不可迴避的,因為程式最終是要執行在記憶體中要通過cpu進行運算的。

準備寫這篇文章的的起因是在ios開發過程中系統經常crash掉(這篇文章的草稿是2023年寫的,感覺一直無法完善,過了這麼長時間自己仍舊是那樣的對記憶體管控一知半解,發出來請大家指正一下吧),其實問題很簡單就是對記憶體沒有處理好,在受限裝置上記憶體的管理尤其重要。

我們先明確一下概念

程式本身分為資料段和**端;

記憶體中的區域包括堆、棧、靜態和全域性儲存區、常量儲存區;

各種不同語言提供的記憶體管理機制也不同,c基本上可以理解為是手動管理;c++的stl提供了auto_ptr、boost(c++11)提供了shared_ptr,symbian c++是清理棧,com是引用計數器,object-c是引用計數器和autoreleasepools;而高階語言則紛紛提供了自動管理機制。

記憶體管理的基本原則是誰使用,誰管理,誰釋放。

有時候這一條原則讓我在相當長的一段時間內很是迷茫,使用者獲取了乙個記憶體區域的控制權,進行修改,而提供記憶體區域的**卻無法知道這段記憶體區域的使用週期。為了提供乙個可以修改的記憶體區域需要暴露出乙個指標來,但這個指標的使用和修改卻是不受提供者所控制的,此時所有權的變換使的我對這句話的理解產生了疑問。而在多個使用者**使用這個指標的時候如何去協調管理和釋放的問題就成為了另乙個疑問。很多時候往往會是為了解決程式的bug讓他不至於立即crash而直接不去釋放這段記憶體區域,乙個簡單的程式,這樣做不會有什麼問題,也不會有人去計較你對記憶體的粗暴占有,因為當你的程式結束的時候,系統會**這一部分記憶體。即使是大的程式問題也可能會在在短時間內被隱藏,然而7x24執行的服務程式隨著時間的推移,這些洩露記憶體對系統產生的影響會逐步的顯現出來,此時必須應該去解決這一問題,而我本人在很長一段時間內對記憶體洩露產生問題認識不足。

引用計數:內部計數器和外部計數器

raii:是c++提供的一種對記憶體管理的機制,在進入作用域時執行構造,離開作用域時執行析構。這也是智慧型指標實現的基礎。

記憶體區域的所有權轉移與複製的問題

對記憶體讀寫的優化——寫時複製。stl的string實現就是寫時複製。這樣講會提高記憶體的io效能,節省儲存空間。

目前個人認為採用智慧型指標來實現對記憶體的控制和管理是最高效的方法,當然實現方法有很多種,在融入了引用計數器,raii這樣的機制,並有效控制所有權的轉移的問題,這樣就是和記憶體池一樣優秀的記憶體管理方法。

記憶體管理有兩個方面乙個是位元組的,乙個是物件的。在系統初始化時把物件池化在需要時申請出來,在不需要的時候返回給物件池,這樣會極大的加快物件的初始化和銷毀效率,並且能夠避免某些記憶體碎片的產生,通過模板元的泛化使得物件池的支援會更加通用。而位元組級別的記憶體池面臨的問題會比較複雜,他沒有辦法去一次構建乙個泛化的物件來管理,我們只能通過有效的搜尋結構和演算法來達到快速分配和**不同數量的記憶體的方法。

2023年時我曾經自己實現過乙個記憶體池,是基於位元組級別的,實現模式是預分配好對應大小的記憶體桶,根據申請記憶體大小直接分配記憶體,而不需要切換到核心。當初這個記憶體管理器設計把問題複雜化了,增加了針對於不同程序資料共享的能力,這樣需要新增大量的指標偏移演算法,使得記憶體池的管理不再純粹,這樣原來的效率就喪失了很多,最後只能淪為共享記憶體管理器了。但是,這一實踐過程,完整的實現了記憶體池化與分配的整個過程,後來抽離出了乙個小的記憶體池管理器。

窺探記憶體管理

關於記憶體的問題是乙個很初級的問題也是乙個很高深的問題,確切的說是個入門必須了解的問題也是很有內涵的問題。如何認識記憶體,使用記憶體,管理記憶體是乙個一直貫穿於編碼過程的核心問題。拋棄所有的架構概念,剝離覆蓋在軟體開發的迷霧,程式本身只是乙個記憶體中資料不斷的遷移與cpu計算器不斷進行數值運算的過程...

Linux 窺探記憶體的命令。

此命令用於顯示系統記憶體的使用情況,包括總體記憶體 已經使用的記憶體 還可用於顯示系統核心使用的緩衝區,包括緩衝 buffer 和快取 cache 等。記憶體並不只有占用和空閒兩個簡單狀態,我們從上面的輸出中發現其中有buffers和cached的資料,從字面意義上來講,都是快取,只有弄清楚快取了什...

cocos2d x記憶體管理初步窺探之retai

今天在使用ccarray的時候發現,在乙個類中使用ccarray作為乙個成員時,ccarray總會在初始化之後總會很詭異地被釋放掉了,於是找了一些相關的博文看了一下,也算是對cocos2d x中的一些記憶體管理規則有了更深刻的理解。aretain release和autorelease都是繼承自cc...