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等高性能序列化協議