发布网友 发布时间:2023-03-10 07:15
共1个回答
热心网友 时间:2023-10-12 15:58
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是会回收,循环利用的
该文明确了以下几点: