高效能之記憶體池

2021-06-28 20:36:02 字數 1250 閱讀 5831

記憶體池(memory pool)是一種記憶體分配方式。 通常我們習慣直接使用new、malloc等api申請分配記憶體,這樣做的缺點在於:由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的、大小相等(一般情況下)的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的乙個顯著優點是盡量避免了記憶體碎片,使得記憶體分配效率得到提公升。

(1)針對特殊情況,例如需要頻繁分配釋放固定大小的記憶體物件時,不需要複雜的分配演算法和多執行緒保護。也不需要維護記憶體空閒表的額外開銷,從而獲得較高的效能。

(2)由於開闢一定數量的連續記憶體空間作為記憶體池塊,因而一定程度上提高了程式區域性性,提公升了程式效能。

(3)比較容易控制頁邊界對齊和記憶體位元組對齊,沒有記憶體碎片的問題。

(4)當需要分配管理的內存在100m一下的時候,採用記憶體池會節省大量的時間,否則會耗費更多的時間。

(5)記憶體池可以防止更多的記憶體碎片的產生

(6)更方便於管理記憶體

我們都知道頻繁的動態記憶體分配很可能會造成大量的記憶體碎片和效率低下,因為需要搜尋整個空閒鍊錶找到可以被分配的記憶體塊,而且容易造成記憶體洩漏等問題,那麼如何解決這兩個問題呢?

記憶體池技術帶你走進這個問題的殿堂。

記憶體池技術首先會分配一大塊記憶體給程式,當程式需要分配記憶體的時候從記憶體池中去獲得,而且不需要去釋放記憶體,當記憶體池不在用的時候釋放整個記憶體即可,只分配,不釋放,大大減少了時間。

優勢:1·效率快,無需呼叫malloc或者new,系統呼叫慢,而且搜尋空閒塊也慢

2·不會產生過多的記憶體碎片,

3·可以避免記憶體洩漏

nginx=nx

nginx的記憶體池設計非常巧妙得利用了http短連線的特性,為每乙個http請求分配乙個記憶體塊,當http連線保持時,這個記憶體塊只分配不釋放,當 http斷開時,釋放整塊大記憶體,由於http基本上連線時間都是非常短的,所以不可能會出現記憶體池把整個記憶體沾滿的情況

memcached的記憶體池主要是針對鍵值對的特性進行優化的,但實現方式和nginx完全不同,這個我沒有仔細研究,具體特性不詳

stl的二級分配器也是一種屬於只分配不釋放的記憶體池,但是它只針對於小雨128bytes的小塊記憶體申請和釋放,大於128bytes的記憶體申請還是直 接呼叫malloc的。在使用stl過程中,預設是關閉二級分配器,如果真要使用,要通過巨集來進行開啟該功能。但是用這個分配器要小心,如果你申請了大量 的小塊記憶體,有可能佔滿機器的記憶體的話,stl就有可能造成整個系統記憶體不足了,因為它不釋放!但效能還是非常強悍的。

C 高效能記憶體池,支援動態分配記憶體塊

在c c 中記憶體的管理是非常頭痛的事情,這裡作者不再多解釋,請參考這篇文章 作者也是參考這篇文章進行對記憶體池的改進和進化。1 封裝乙個類用於管理記憶體池的使用如下,很容易看得懂,其實就是向記憶體池申請size個空間並進行構造,返回是首個元素的位址。釋放也是一樣,不過釋放多個的時候需要確保這多個元...

記憶體管理之記憶體池的設計

如何更好的管理在應用程式中記憶體的使用,同時提高記憶體使用的效率,這是值得每乙個做開發的人深思的問題。記憶體池 memory pool 提供了一種比較可行的解決方案。下面就一般記憶體池的原理與設計進行 一般的記憶體池的使用,分為以下幾個過程 1.建立記憶體池。這個過程的主要任務是預先分配足夠大的記憶...

山寨STL實現之記憶體池

記憶體池的作用 減少記憶體碎片,提高效能。首先不得不提的是win32和x64中對於指標的長度是不同的,在win32中乙個指標佔4位元組,而在x64中乙個指標佔8位元組。也正是不清楚這一點,當我在x64中將指標作為4位元組修改造成其他資料異常。首先我們先來定義三個巨集 define align siz...