雙池合璧:編程
鏈接線程池專門負責監聽客戶端鏈接請求,並完成鏈接的創建(包括諸如握手、安全認證等過程)。後端
鏈接的創建自己是一個極其複雜、損耗性能的過程,此處使用線程池,可以極大的增長處理客戶端鏈接的能力。緩存
鏈接線程池會將成功創建的鏈接註冊到後端I/O線程池,由I/O線程池負責對相應鏈接的網絡數據進行讀寫、編解碼處理。安全
在實際應用中,咱們一般會定義相應的業務消息協議,並選擇合適的序列化機制,netty I/O線程池部分根據預設的規則進行數據的編解碼。網絡
其實咱們這裏說的業務線程池不在網絡層處理邏輯裏。處理到I/O線程池部分,所須要的請求數據已經處理完畢,涉及具體的業務處理邏輯,比較複雜的,或者時間、性能消耗特別大的,一般咱們會單獨設置相應的線程池來處理。多線程
I/O線程的內部串行化:併發
局部無鎖化串行處理,避免多線程切換帶來的複雜性及性能損耗(鎖競爭、CPU資源分配)。至於對於處理能力的考慮,能夠經過調整I/O線程池容量來平衡。性能
儘可能避免I/O線程和業務線程混淆及切換。優化
TCP接收和發送使用直接內存代替堆內存,避免了數據在堆內存和主內存之間的複製消耗,提高了I/O讀取和寫入的性能。操作系統
依賴於操做系統零拷貝特性直接將緩衝區數據發送到相應的通道。
傳統的方式,先將源文件拷貝到內存,而後由內存寫到目的文件。
netty 利用 NIO FileChannel transferTo方法,通道對通道寫數據。
組合緩存使用能夠像操做單個緩存同樣操做多個緩存,避免了傳統的操做方式帶來的內存複製性能消耗。
netty支持經過內存池的方式循環利用ByteBuf,避免了頻繁的建立,銷燬ByteBuf帶來的資源及性能損耗。
ByteBuf byte數據緩衝區,是NIO編程的主要對象。高負載情景下,ByteBuf內存池使用,能夠有效下降GC頻率。
PoolArena netty的內存池實現類。PoolArena 是由多個Chunk組成的大塊內存區域,每一個Chunk由一個多個Page組成。
Chunk:組織管理Page的內存分配和釋放,Page被構建爲二叉樹形式:
PoolSubpage:對於小於Page的內存使用,直接在Page中完成分配,每一個Page切分爲大小相同的多個存儲塊兒,存儲塊兒的大小由第一次申請的內存塊兒大小決定。
回收:netty使用狀態位標識Chunk及Page內存可用性,Chunk標識二叉樹Page節點使用狀態;Page標識內部內存塊兒的使用狀態。
合理的使用線程安全容器、原子類等,提高系統的併發處理能力,
經過引用計數器及時的申請釋放再也不引用的對象,細粒度的內存管理下降了GC的頻率,減小GC帶來的時延增大和CPU損耗。
Netty 4中 ByteBuf 和 ByteBufHolder 引入引用計數器功能(實現ReferenceCounted接口),在特定的對象上跟蹤引用的數目。
引用計數器初始爲1。若是對象活動的引用計數器大於0,則不會被釋放。當引用計數減小到0,實例將會被釋放。這也是 PooledByteBufAllocator 內存池應用的核心特性。