1.Tomcat 支持四種線程模型介紹
什么是IO?
IO是指為數(shù)據(jù)傳輸所提供的輸入輸出流,其輸入輸出對象可以是:文件、網(wǎng)絡服務、內(nèi)存等。

提問:
假設應用在從硬盤中讀取一個大文件過程中,此時CPU會與硬盤一樣出于高負荷狀態(tài)么?
演示:
演示觀察大文件的讀寫過程當中CPU 有沒有發(fā)生大波動。
演示結(jié)果:CPU 沒有太高的增漲
通常情況下IO操作是比較耗時的,所以為了高效的使用硬件,應用程序可以用一個專門線程進行IO操作,而另外一個線程則利用CPU的空閑去做其它計算。這種為提高應用執(zhí)行效率而采用的IO操作方法即為IO模型。

使用指定IO模型的配置方式:
配置 server.xml 文件當中的 <Connector protocol="HTTP/1.1"> 修改即可。
默認配置 8.0 protocol=“HTTP/1.1” 8.0 之前是 BIO 8.0 之后是NIO
BIO
protocol=“org.apache.coyote.http11.Http11Protocol“
NIO
protocol=”org.apache.coyote.http11.Http11NioProtocol“
AIO
protocol=”org.apache.coyote.http11.Http11Nio2Protocol“
APR
protocol=”org.apache.coyote.http11.Http11AprProtocol“
2.Tomcat BIO、NIO實現(xiàn)過程源碼解析
BIO 與NIO有什么區(qū)別?
分別演示在高并發(fā)場景下BIO與NIO的線程數(shù)的變化?
演示數(shù)據(jù):

1、網(wǎng)絡
2、程序執(zhí)行業(yè)務用時
BIO 線程模型講解

NIO 線程模型講解

BIO 源碼解讀
線程組:
Accept 線程組 acceptorThreadCount=
exec 線程組 maxThread
JIoEndpoint
Acceptor extends Runnable
SocketProcessor extends Runnable
BIO
線程數(shù)量 會受到 客戶端阻塞、網(wǎng)絡延遲、業(yè)務處理慢===>線程數(shù)會更多
NIO
線程數(shù)量 會受到業(yè)務處理慢===>線程數(shù)會更多
NIO有了Poller處理連接,不斷輪循讀取select key,將讀完的連接交給線程池處理邏輯,線程池處理完后返回Poller,Poller在進行寫,寫完后返回給瀏覽器,讀有三個方法,select(),selectLong(),selectNow()
3.Tomcat connector 并發(fā)參數(shù)解讀

4.Tomcat 類加載機制源碼解析
類加載的本質(zhì)
是用來加載 Class 的。它負責將 Class 的字節(jié)碼形式轉(zhuǎn)換成內(nèi)存形式的 Class 對象。字節(jié)碼可以來自于磁盤文件 *.class,也可以是 jar 包里的 *.class,也可以來自遠程服務器提供的字節(jié)流,字節(jié)碼的本質(zhì)就是一個字節(jié)數(shù)組 []byte,它有特定的復雜的內(nèi)部格式。
JVM 運行實例中會存在多個 ClassLoader,不同的 ClassLoader 會從不同的地方加載字節(jié)碼文件。它可以從不同的文件目錄加載,也可以從不同的 jar 文件中加載,也可以從網(wǎng)絡上不同的靜態(tài)文件服務器來下載字節(jié)碼再加載。
jvm里ClassLoader的層次結(jié)構(gòu)

Tomcat的 類加載順序

在Tomcat中,默認的行為是先嘗試在Bootstrap和Extension中進行類型加載,如果加載不到則在WebappClassLoader中進行加載,如果還是找不到則在Common中進行查找。。
NoClassDefFoundError
NoClassDefFoundError是在開發(fā)JavaEE程序中常見的一種問題。該問題會隨著你所使用的JavaEE中間件環(huán)境的復雜度以及應用本身的體量變得更加復雜,尤其是現(xiàn)在的JavaEE服務器具有大量的類加載器。
在JavaDoc中對NoClassDefFoundError的產(chǎn)生是由于JVM或者類加載器實例嘗試加載類型的定義,但是該定義卻沒有找到,影響了執(zhí)行路徑。換句話說,在編譯時這個類是能夠被找到的,但是在執(zhí)行時卻沒有找到。
這一刻IDE是沒有出錯提醒的,但是在運行時卻出現(xiàn)了錯誤。
NoSuchMethodError
在另一個場景中,我們可能遇到了另一個錯誤,也就是NoSuchMethodError。
NoSuchMethodError代表這個類型確實存在,但是一個不正確的版本被加載了。
ClassCastException
ClassCastException,在一個類加載器的情況下,一般出現(xiàn)這種錯誤都會是在轉(zhuǎn)型操作時,比如:A a = (A) method();,很容易判斷出來method()方法返回的類型不是類型A,但是在 JavaEE 多個類加載器的環(huán)境下就會出現(xiàn)一些難以定位的情況。