讓咱們天天都能看到本身的進步。老王帶你打造最全的 Java 面試清單,認真把一件事作到最好。程序員
本文是前文《Java 最多見的 200+ 面試題》的第二個補充模塊,第一模塊爲:《Java 200+ 面試題補充 ThreadLocal 模塊》。web
1.Netty 是什麼?
Netty 是一款基於 NIO(Nonblocking I/O,非阻塞IO)開發的網絡通訊框架,對比於 BIO(Blocking I/O,阻塞IO),他的併發性能獲得了很大提升。難能難得的是,在保證快速和易用性的同時,並無喪失可維護性和性能等優點。面試
2.Netty 的特色是什麼?
- 高併發:Netty 是一款基於 NIO(Nonblocking IO,非阻塞IO)開發的網絡通訊框架,對比於 BIO(Blocking I/O,阻塞IO),他的併發性能獲得了很大提升。
- 傳輸快:Netty 的傳輸依賴於零拷貝特性,儘可能減小沒必要要的內存拷貝,實現了更高效率的傳輸。
- 封裝好:Netty 封裝了 NIO 操做的不少細節,提供了易於使用調用接口。
3.什麼是 Netty 的零拷貝?
Netty 的零拷貝主要包含三個方面:編程
- Netty 的接收和發送 ByteBuffer 採用 DIRECT BUFFERS,使用堆外直接內存進行 Socket 讀寫,不須要進行字節緩衝區的二次拷貝。若是使用傳統的堆內存(HEAP BUFFERS)進行 Socket 讀寫,JVM 會將堆內存 Buffer 拷貝一份到直接內存中,而後才寫入 Socket 中。相比於堆外直接內存,消息在發送過程當中多了一次緩衝區的內存拷貝。
- Netty 提供了組合 Buffer 對象,能夠聚合多個 ByteBuffer 對象,用戶能夠像操做一個 Buffer 那樣方便的對組合 Buffer 進行操做,避免了傳統經過內存拷貝的方式將幾個小 Buffer 合併成一個大的 Buffer。
- Netty 的文件傳輸採用了 transferTo 方法,它能夠直接將文件緩衝區的數據發送到目標 Channel,避免了傳統經過循環 write 方式致使的內存拷貝問題。
4.Netty 的優點有哪些?
- 使用簡單:封裝了 NIO 的不少細節,使用更簡單。
- 功能強大:預置了多種編解碼功能,支持多種主流協議。
- 定製能力強:能夠經過 ChannelHandler 對通訊框架進行靈活地擴展。
- 性能高:經過與其餘業界主流的 NIO 框架對比,Netty 的綜合性能最優。
- 穩定:Netty 修復了已經發現的全部 NIO 的 bug,讓開發人員能夠專一於業務自己。
- 社區活躍:Netty 是活躍的開源項目,版本迭代週期短,bug 修復速度快。
5.Netty 的應用場景有哪些?
典型的應用有:阿里分佈式服務框架 Dubbo,默認使用 Netty 做爲基礎通訊組件,還有 RocketMQ 也是使用 Netty 做爲通信的基礎。網絡
6.Netty 高性能表如今哪些方面?
- IO 線程模型:同步非阻塞,用最少的資源作更多的事。
- 內存零拷貝:儘可能減小沒必要要的內存拷貝,實現了更高效率的傳輸。
- 內存池設計:申請的內存能夠重用,主要指直接內存。內部實現是用一顆二叉查找樹管理內存分配狀況。
- 串形化處理讀寫:避免使用鎖帶來的性能開銷。
- 高性能序列化協議:支持 protobuf 等高性能序列化協議。
7.Netty 和 Tomcat 的區別?
Netty 和 Tomcat 最大的區別就在於通訊協議,Tomcat 是基於 http 協議的,他的實質是一個基於 http 協議的web容器,可是 Netty 不同,他能經過編程自定義各類協議,由於 Netty 可以本身編碼/解碼字節流,完成相似Redis 訪問的功能,這就是 Netty 和 Tomcat 最大的區別。併發
8.Netty 中有那種重要組件?
- Channel:Netty 網絡操做抽象類,它除了包括基本的 I/O 操做,如 bind、connect、read、write 等。
- EventLoop:主要是配合 Channel 處理 I/O 操做,用來處理鏈接的生命週期中所發生的事情。
- ChannelFuture:Netty 框架中全部的 I/O 操做都爲異步的,所以咱們須要 ChannelFuture 的 addListener()註冊一個 ChannelFutureListener 監聽事件,當操做執行成功或者失敗時,監聽就會自動觸發返回結果。
- ChannelHandler:充當了全部處理入站和出站數據的邏輯容器。ChannelHandler 主要用來處理各類事件,這裏的事件很普遍,好比能夠是鏈接、數據接收、異常、數據轉換等。
- ChannelPipeline:爲 ChannelHandler 鏈提供了容器,當 channel 建立時,就會被自動分配到它專屬的 ChannelPipeline,這個關聯是永久性的。
9.Netty 發送消息有幾種方式?
Netty 有兩種發送消息的方式:框架
- 直接寫入 Channel 中,消息從 ChannelPipeline 當中尾部開始移動;
- 寫入和 ChannelHandler 綁定的 ChannelHandlerContext 中,消息從 ChannelPipeline 中的下一個 ChannelHandler 中移動。
10.默認狀況 Netty 起多少線程?什麼時候啓動?
Netty 默認是 CPU 處理器數的兩倍,bind 完以後啓動。異步
11.Netty 支持哪些心跳類型設置?
- readerIdleTime:爲讀超時時間(即測試端必定時間內未接受到被測試端消息)。
- writerIdleTime:爲寫超時時間(即測試端必定時間內向被測試端發送消息)。
- allIdleTime:全部類型的超時時間。
最後
- 若是你們想更深刻的瞭解 Netty,推薦一本很不錯的掘金小冊給你們(掃描二維碼八折優惠)。
參考文檔
http://www.javashuo.com/article/p-mswdtohs-hs.html分佈式
http://www.javashuo.com/article/p-mzzlokqx-bq.html高併發
http://www.javashuo.com/article/p-yaypcpud-ba.html
https://www.jianshu.com/p/a199ca28e80d
http://www.javashuo.com/article/p-ffipsgac-kp.html
往期文章推薦
Java 最多見的 200+ 面試題
Java 200+ 面試題補充 ThreadLocal 模塊
你真的懂 == 和 equals 的區別嗎?
程序員精美簡歷Top榜—面試必備
程序員專屬精美簡歷合集——第二彈