Java 200+ 面试题补充② Netty 模块
讓我們每天都能看到自己的進步。老王帶你打造最全的 Java 面試清單,認真把一件事做到最好。
本文是前文《Java 最常見的 200+ 面試題》的第二個補充模塊,第一模塊為:《Java 200+ 面試題補充 ThreadLocal 模塊》。
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,推薦一本很不錯的掘金小冊給大家(掃描二維碼八折優惠)。
- 查看全部面試題目:《Java 最常見的 200+ 面試題》
參考文檔
https://blog.csdn.net/chenssy/article/details/78703551
https://blog.csdn.net/summerZBH123/article/details/79344226
https://blog.csdn.net/thinking_fioa/article/details/80588138
https://www.jianshu.com/p/a199ca28e80d
https://blog.csdn.net/linuu/article/details/51385682
往期文章推薦
Java 最常見的 200+ 面試題
Java 200+ 面試題補充 ThreadLocal 模塊
你真的懂 == 和 equals 的區別嗎?
程序員精美簡歷Top榜—面試必備
程序員專屬精美簡歷合集——第二彈
總結
以上是生活随笔為你收集整理的Java 200+ 面试题补充② Netty 模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 很实用的21个SQL小技巧!
- 下一篇: Java中竟有18种队列?45张图!安排