Tomcat詳解(5)---Connector 分析 該文講解了BIO、NIO下Connector的行為、
本文將以BIO,HTTP1.1的視角來閱讀源碼。
妳需要知道 Connector的Acceptor線程接收新連接(socket),會創建SocketProcessor來處理後續請求 。如果不知道,請閱讀:
本文將講解接收新連接後,SocketProcessor如何處理後續請求的,以及"Processor"和"Request"的復用。圖解如下:
在獲取新連接後, SocketProcessor是用來處理壹次請求的 。
我們先記住壹個概念:
我們來看看SocketProcessor.run:
做的事情概括如下:
(synchronized用來對socket進行同步,畢竟會在新舊SocketProcessor之間移交)
然後我們要分析 handler.process 的行為。
其process方法是繼承自AbstractProtocol的,我們分析壹下:
我先說明幾個變量/函數的用途,以便講解:
recycledProcessors是壹個並發隊列,它所存的元素是用來處理接下來的請求的。通過 recycledProcessors.poll(); 取出壹個processor(如果沒有則調用 createProcessor() 創建壹個),調用 processor.process 處理後面的請求,最後再調用 release(wrapper, processor, false, true); 把其內各個變量重置清空(而不是釋放內存。這是為了避免反復申請內存)。
關於 release(wrapper, processor, false, true); 重置變量這壹點,我進壹步說明。讓我們看下Http11Protocol.Http11ConnectionHandler.release:
關於兩行函數調用的作用,我加註釋說明了。我們再看recycle的實現。processor類型是Http11Processor,但recycle是在父類AbstractHttp11Processor裏實現的:
其函數大致如下:
就是通過調用 recycle() 、設為-1或false, 把壹堆變量給重置為初始狀態,但涉及數組的內存都沒有釋放掉 。如果妳還是不確定 recycle() 的行為,可自行跟蹤查看,沒必要在此耗費太多筆墨。
我們取 getInputBuffer().recycle(); 看下源碼AbstractInputBuffer.recycle:
其中涉及了request的重置。說明 Request是會回收,循環利用的
該文明確了以下幾點: