大忙人系列面試題_Netty的性能優化措施

一、零拷貝

1、Netty的接收和發送消息,均使用堆外直接內存進行Socket的讀寫,不需要進行字節緩衝的二次拷貝。

2、Netty提供了組合Buffer對象,可以聚合多個ByteBuffer對象。用戶可以像操作一個Buffer那樣方便地對組合Buffer進行操作。避免了傳統通過內存拷貝的方式將幾個小的Buffer合併成一個大的Buffer。

3、Netty的文件傳輸採用了transferTo方法,它可以直接將文件緩衝區的數據發送到目標Channel,避免了傳統通過循環write方式導致的內存拷貝問題。

二、內存池

隨着JVM虛擬機和JIT即時編譯技術的發展,對象的分配和回收是個非常輕量級的工作。但是對於緩衝區Buffer,情況不同,特別是對於堆外直接內存的分配和回收。Netty提供了基於內存池的緩衝區“重用”機制。採用這種內存池的ByteBuf相比於每次都創建的ByteBuf性能提升23倍左右。

三、無鎖化的串行設計

在大多數場景下,並行多線程處理可以提升系統的併發性能。但是處理不當,容易出現“鎖競爭”,嚴重影響性能。爲了避免鎖競爭帶來的性能損耗,可以通過串行化設計,即消息的處理儘可能在同一個線程內完成,期間不進行線程切換,這樣就避免了多線程競爭的同步鎖。

而Netty採用了“串行無鎖化”設計,在I/O線程內部進行串行操作,避免多線程競爭導致的性能下降。表面上看,串行化設計似乎CPU利用率不高,併發程度不夠。但是通過調整NIO線程池的線程參數,可以同時啓動多個串行化的線程並行運行,這種局部無鎖化的串行線程設計相比一個隊列+多個線程模型,性能更優。

四、高效的併發編程

volatile的大量、正確的使用;CAS和原子類的廣泛應用;線程安全容量的使用;通過讀寫鎖提升併發性能。

 

 

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