Netty4 中的內存管理

 

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

 

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

 

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

 

jemalloc

 

jemalloc 是由Jason Evans在FreeBSD項目中引入的,其主旨是爲了提高在併發環境下內存的分配效率。說白了就是替代 malloc。malloc之因此沒有照顧到併發環境,那是因爲在那個時代併發還只在理論,不曾普及。而如今則是多核的天下,連 手機都動則二、4核,甚至於8核了。與jemalloc齊名的還有Google的tcmalloc,其 實現與jemalloc多少也有點類似,這裏不作介紹。優化

 

jemalloc的理念

 

咱們以買火車票爲例,來簡單地說明一下jemalloc與malloc的區別。原來的malloc,至關於只有一個售票窗口的售票大廳, 而jemalloc則在同一個售票大廳裏面適量地增長的窗口。固然,火車票的總量(即內存大小)是不變的,買票的人至關於線程了。 提及來這也是很天然的事情的。google

 

在這裏,一個售票窗口就是至關於一個Arena線程

 

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

 

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

 

jemalloc allocation size category

 

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

全文......內存

相關文章
相關標籤/搜索