背景:
用Jmeter做了一次简单的压测,通过JDK自带的Jconsole工具和对应的进程建立连接,可以通过很形象的观察到Tomcat内存大小、活动线程的个数、加载类的个数、CPU的占有率的变化...然后就想看一下tomcat内部是如何管理这些请求的...
初始化流程:
初始化流程.png请求分析:
请求在Acceptor登录,Acceptor是一个Runnable,里面有个while循环,在不停的接收请求...分两步:
- 校验当前连接数是否超过max connections
-
获取接下来的新的连接,如果没有,就阻塞...有的话,就返回一个SocketChannel。
image.png
Tomcat默认的最大连接数:
image.png
利用LimitLatch的特性来控制是否阻塞或放行...其底层本质仍然是大名鼎鼎的AbstractQueuedSynchronizer,如图所示:
image.png
底层使用死循环或者LockSupport.park(this)来实现阻塞...
创建自定义线程池:
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);
}
总结:
很多困难和阻碍是自己想象出来的...
网友评论