Netty4 中的內存管理


 

在Netty4中引入了新的內存管理機制極大地提升其性能,本文將對該內在管理機制進行剖析。

 

這里有篇文章講述了在推特(Twitter)內部 使用Netty的狀況以及Netty4所帶來的性能收益。

 

在分析Netty4的PooledByteBufAllocator之前,我們最好先認識一下jemalloc。 Netty在4.0之前的版本已經嘗試過通過優化內存管理的方式來提高性能(如果我沒有記錯的話),但4.0中的改進則特別 顯著。在這個版本中,其內存管理實現主要是參考了jemalloc

 

jemalloc

 

jemalloc 是由Jason Evans在FreeBSD項目中引入的,其主旨是為了提升在並發環境下內存的分配效率。說白了就是替代 malloc。malloc之所以沒有照顧到並發環境,那是由於在那個時代並發還只在理論,未曾普及。而現在則是多核的天下,連 手機都動則2、4核,甚至於8核了。與jemalloc齊名的還有Google的tcmalloc,其 實現與jemalloc多少也有點相似,這里不做介紹。

 

jemalloc的理念

 

我們以買火車票為例,來簡單地說明一下jemalloc與malloc的區別。原來的malloc,相當於只有一個售票窗口的售票大廳, 而jemalloc則在同一個售票大廳里面適量地增加的窗口。當然,火車票的總量(即內存大小)是不變的,買票的人相當於線程了。 說起來這也是很自然的事情的。

 

在這里,一個售票窗口就是相當於一個Arena

 

Arena則按頁(Page)來的管理內存,也就是說,一張車票就相當於一頁。(后面就不太適合用火車票的例子了)。

 

同時,jemalloc還根據所請求的內存大小,對其進行分類。如下圖:

 

jemalloc allocation size category

 

默認情況下,Page的大小為4KB。如圖,有三類,small、large和huge。small類的內存請求都屬於一個內存頁之內 (沒有半張車票出售:()。另外,在small類里面,又分了三個子類,分別是Tiny、Quantum-Spaced和Sub-page。 這幾個概念都在Netty中得到應用。

全文......


免責聲明!

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



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