C 使用記憶體池,Stream池防止記憶體碎片化

2021-10-21 00:27:50 字數 2412 閱讀 3931

為什麼要引入記憶體池?引入記憶體池的好處是什麼?引入記憶體池能解決哪些問題?什麼情況下使用記憶體池效果更加明顯?相信大家都懂,那我們就不說了,直接來看看怎麼使用吧。

我想了想,覺得還是要先解答一下上面的問題,不然我有些過意不去(qiang po zheng)。

為什麼引入記憶體池,好處是什麼?能夠重複利用已申請的記憶體。

避免記憶體碎片化。

減少開闢大記憶體的時間。

什麼情況下使用效果更加明顯?重複開闢大記憶體操作。

首先先說記憶體池**,本部落格使用的記憶體池是rrqmcore中的bytepool。該記憶體池的特點是設計思路簡單應用方便可高併發動態擴建byte直接訪問流訪問等。

引用nuget包,搜尋rrqmcore,然後應用至專案。

宣告bytepool記憶體池例項。

完成宣告以後,即可使用getbyteblock方法獲取記憶體,該方法共有三各過載,詳細如下。}}

獲得到的byteblock可直接當流使用,因為其繼承於stream。除此之外,還能直接獲取buffer屬性,直接對byte陣列操作。

使用完的byteblock直接呼叫dispose方法,即可釋放。該操作執行完有兩個結果,如果擴建完的byteblock不大於單元體最大設定值,即**至池中。如果擴建的尺寸太大,則直接丟棄引用,由gc自動釋放。

不僅如此,考慮到byteblock重複釋放的問題,使用者可以呼叫trydispose進行釋放,該方法要求傳入唯一id值,該值是記憶體池統一分配的,只有值唯一匹配時,才會是釋放。

測試環境:

測試硬體:戴爾筆記本g5,i7-10750h,8g ram+256g固態+1t機械。 測試系統:window10 家庭版,x64位。

測試內容:重複申請1000萬次1024byte的記憶體。

測試結果:

普通記憶體申請耗時0.546秒

記憶體至18mb

記憶體池申請耗時0.888秒

記憶體至18mb

測試內容:重複申請1000萬次1024*100 byte的記憶體。

測試結果:

普通記憶體申請耗時1分13秒

記憶體至151mb,然後釋放

記憶體池申請耗時0.917秒

記憶體至18mb

結論從測試結果來看,記憶體池在申請小記憶體時並沒有時間優勢,但是也與普通申請沒有太大差距,在稍大記憶體時,記憶體池效能優越性體現明顯。當然記憶體池的好處還不知這些,但是最起碼也證明了記憶體池的必要性。

申請的byteblock不能重複釋放,不然會導致該記憶體片在別的**中使用時被釋放的情況發生。

盡量使用getbyteblock(long bytesize)的方法獲取記憶體,效率較高。

使用完的byteblock應該及時釋放,不然會導致gc頻繁釋放。

記憶體池 C 記憶體池

c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...

記憶體池,程序池,執行緒池

在使用new malloc在堆區申請一塊記憶體的時候,由於每次申請的記憶體大小不一樣就會產生很多記憶體碎片,不好管理和浪費。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠用再 繼續申請新的記憶...

記憶體池 執行緒池 程序池

由於伺服器的硬體資源 充裕 那麼提高伺服器效能的乙個很直接的方法就是以空間換時間,即 浪費 伺服器的硬體資源,以換取其執行效率。這就是池的概念。池是一組資源的集合,這組資源在伺服器啟動之初就完全被建立並初始化,這稱為靜態資源分配。當伺服器進入正式執行階段,即開始處理客戶請求的時候,如果它需要相關的資...