Tomcat最大连接数、自定义线程池、默认参数

pexels-rachel-claire-4993102.jpg

背景:

用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);
    }

总结:

很多困难和阻碍是自己想象出来的...

你可能感兴趣的:(Tomcat最大连接数、自定义线程池、默认参数)