Netty高性能的原因

Netty 是一個利用 Java 的高級網絡的能力,隱藏其背後的複雜性而提供一個易於使用的 API 的客戶端/服務器框架。而且併發高、傳輸快。有以下幾個原因

1、網絡模型

多路複用IO,採用一個線程處理連接請求,多個線程處理IO請求,他比BIO能處理更多請求,數據請求和數據處理都是異步,底層採用了linux的select、poll、epoll

2、零拷貝

主要使用了bytebuffer,使用了堆外內存

3、內存池

採用了內存池技術,避免了頻繁申請內存的消耗,內存池分析:https://my.oschina.net/u/3837147/blog/5150786

4、鎖

netty採用了更細粒度的鎖,注意鎖的對象本身大小,減少空間佔用,注意鎖的速度,提高速度,不同場景選擇不同的併發類 ,因需而邊,衡量好鎖的價值,能不用則不用

比如用AtomicLongFieldUpdater,代替了AtomicLong,裏面採用volatile long,減少空間佔用(對象頭)

private static final AtomicLongFieldUpdater<ChannelOutboundBuffer> TOTAL_PENDING_SIZE_UPDATER = AtomicLongFieldUpdater.newUpdater(ChannelOutboundBuffer.class, "totalPendingSize");

採用LongAdder代替AtomicLong,在高併發下,LongAdder會採用分段機制,來提高性能

5、整體架構採用,整體並行,局部串行的機制,避免了多線程競爭和同步鎖

6、採用更爲輕量的FastThreadLocal來代替ThreadLocal

7、高性能序列化協議,支持protobuf等高性能序列化協議

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章