GC+堆排+Tomcat+演算法題,漲姿勢了!
Java BIO 問題分析
- 每個請求都需要建立獨立的執行緒,與對應的客戶端進行資料 Read,業務處理,資料 Write 。
- 當併發數較大時,需要建立大量執行緒來處理連線,系統資源佔用較大。
- 連線建立後,如果當前執行緒暫時沒有資料可讀,則執行緒就阻塞在 Read 操作上,造成執行緒資源浪費
nio介紹
- Java NIO 全稱 java non-blocking IO,是指 JDK 提供的新 API。從 JDK1.4 開始,Java 提供了一系列改進的輸入/輸出的新特性,被統稱為 NIO(即 New IO),是同步非阻塞的
- NIO 相關類都被放在 java.nio 包及子包下,並且對原 java.io 包中的很多類進行改寫。【基本案例】
- NIO 有三大核心部分:Channel(通道),Buffer(緩衝區), Selector(選擇器)
Selector 、 Channel 和 Buffer 的關係圖:
- 每個channel都會對應一個Buffer
- Selector 對應一個執行緒, 一個執行緒對應多個 channel(連線)
- 該圖反應了有三個channel註冊到該selector//程式
- 程式切換到哪個channel是有事件決定的,Event就是一個重要的概念
- Selector 會根據不同的事件,在各個通道上切換
- Buffer 就是一個記憶體塊 , 底層是有一個數組
- 資料的讀取寫入是通過Buffer,這個和BIO,BIO中要麼是輸入流,或者是輸出流, 不能雙向,但是 NIO 的 Buffer 是可以讀也可以寫, 需要 flip 方法切換 channel 是雙向的, 可以返回底層作業系統的情況, 比如 Linux , 底層的作業系統通道就是雙向的。
緩衝區(Buffer)
緩衝區(Buffer):緩衝區本質上是一個可以讀寫資料的記憶體塊,可以理解成是一個容器物件(含陣列),該物件提供了一組方法,可以更輕鬆地使用記憶體塊,,緩衝區物件內建了一些機制,能夠跟蹤和記錄緩衝區的狀態變化情況。Channel 提供從檔案、網路讀取資料的渠道,但是讀取或寫入的資料都必須經由 Buffer。
channel
NIO 的通道類似於流,但有些區別如下:
- 通道可以同時進行讀寫,而流只能讀或者只能寫
- 通道可以實現非同步讀寫資料
- 通道可以從緩衝讀資料,也可以寫資料到緩衝:
- BIO 中的 stream 是單向的,例如 FileInputStream 物件只能進行讀取資料的操作,而 NIO 中的通道(Channel) 是雙向的,可以讀操作,也可以寫操作。
- Channel 在 NIO 中是一個介面
public interface Channel extends Closeable{}
- 常 用 的 Channel 類 有 : FileChannel 、 DatagramChannel 、 ServerSocketChannel 和 SocketChannel 。 【ServerSocketChanne 類似 ServerSocket , SocketChannel 類似 Socket】
Selector 示意圖和特點說明
- Java 的 NIO,用非阻塞的 IO 方式。可以用一個執行緒,處理多個的客戶端連線,就會使用到 Selector(選擇器)
- Selector 能夠檢測多個註冊的通道上是否有事件發生(注意:多個 Channel 以事件的方式可以註冊到同一個 Selector),如果有事件發生,便獲取事件然後針對每個事件進行相應的處理。這樣就可以只用一個單執行緒去管 理多個通道,也就是管理多個連線和請求。
- 只有在連線/通道真正有讀寫事件發生時,才會進行讀寫,就大大地減少了系統開銷,並且不必為每個連線都 建立一個執行緒,不用去維護多個執行緒
- 避免了多執行緒之間的上下文切換導致的開銷
-
Netty 的 IO 執行緒 NioEventLoop 聚合了 Selector(選擇器,也叫多路複用器),可以同時併發處理成百上千個客
戶端連線。
-
當執行緒從某客戶端 Socket 通道進行讀寫資料時,若沒有資料可用時,該執行緒可以進行其他任務。
-
執行緒通常將非阻塞 IO 的空閒時間用於在其他通道上執行 IO 操作,所以單獨的執行緒可以管理多個輸入和輸出
通道。
-
由於讀寫操作都是非阻塞的,這就可以充分提升 IO 執行緒的執行效率,避免由於頻繁 I/O 阻塞導致的執行緒掛
起。
-
一個 I/O 執行緒可以併發處理 N 個客戶端連線和讀寫操作,這從根本上解決了傳統同步阻塞 I/O 一連線一執行緒模型,架構的效能、彈性伸縮能力和可靠性都得到了極大的提升。
總結
螞蟻面試比較重視基礎,所以Java那些基本功一定要紮實。螞蟻的工作環境還是挺讚的,因為我面的是穩定性保障部門,還有許多單獨的小組,什麼三年1班,很有青春的感覺。面試官基本水平都比較高,基本都P7以上,除了基礎還問了不少架構設計方面的問題,收穫還是挺大的。
經歷這次面試我還通過一些渠道發現了需要大廠真實面試主要有:螞蟻金服、拼多多、阿里雲、百度、唯品會、攜程、豐巢科技、樂信、軟通動力、OPPO、銀盛支付、中國平安等初,中級,高階Java面試題集合,附帶超詳細答案,希望能幫助到大家。