pexels-rachel-claire-4993102.jpg
背景:
用Jmeter做了一次簡單的壓測叶摄,通過JDK自帶的Jconsole工具和對應(yīng)的進程建立連接,可以通過很形象的觀察到Tomcat內(nèi)存大小安拟、活動線程的個數(shù)蛤吓、加載類的個數(shù)、CPU的占有率的變化...然后就想看一下tomcat內(nèi)部是如何管理這些請求的...
初始化流程:
初始化流程.png
請求分析:
請求在Acceptor登錄糠赦,Acceptor是一個Runnable会傲,里面有個while循環(huán),在不停的接收請求...分兩步:
- 校驗當(dāng)前連接數(shù)是否超過max connections
-
獲取接下來的新的連接愉棱,如果沒有唆铐,就阻塞...有的話助泽,就返回一個SocketChannel森逮。
image.png
Tomcat默認的最大連接數(shù):
image.png
利用LimitLatch的特性來控制是否阻塞或放行...其底層本質(zhì)仍然是大名鼎鼎的AbstractQueuedSynchronizer,如圖所示:
image.png
底層使用死循環(huán)或者LockSupport.park(this)來實現(xiàn)阻塞...
創(chuàng)建自定義線程池:
public void createExecutor() {
internalExecutor = true;
TaskQueue taskqueue = new TaskQueue();
TaskThreadFactory tf = new TaskThreadFactory(getName() + "-exec-", daemon, getThreadPriority());
executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60, TimeUnit.SECONDS,taskqueue, tf);
taskqueue.setParent( (ThreadPoolExecutor) executor);
}
總結(jié):
很多困難和阻礙是自己想象出來的...