jetty分析
jetty处理过程:
1 new Server()
(1)初试化线程池 生成固定大小线程数,新来的线程放入BlockingQueue。
(2)初始化ServerConnector
初始化 scheduleExcotorScheduler 做一些线程调度,例如定期执行的线程等。
初始化 byteBufferPool 一个buffer对象池,可以复用各buffer对象,减少gc,channel读取数据的时候可以复用。线程安全并且无锁,对象队列使用了concurrentLinkedQueue,性能提高明显。里面的对象不是等价的,因为可能不同线程需要不同太小的buffer,大小不一定。因此使用了延迟加载,buffer池在初始化的时候,需要指定buffer对象的范围,包括最小值,增量值,最大值;然后从最小容量到最大容量,建立一系列不同大小的bucket做代理,负责延迟加载;buffer池提供acquire()申请和release()释放,申请时需指定大小,从而定位到bucket(比如5.5k大小,会定位到6k的bucket),有则返回,没有则实例化,释放时,同样定位到bucket,清空buffer,放回queue中。如果申请的大小比范围还大,则有特殊处理,还是会new一个需要大小的buffer返回,只是释放的时候不会放入buffer池,让其自然被gc掉。
维护connectionFactory ,用于创建连接对象,比如在aio/nio里面accept到一个连接的时候,把这个连接封装为对象。
取得cpu数量,从而根据cpu数量决定使用多少acceptor线程数量,acceptor线程就是nio中用于accept的线程。总体数量不会太多。
根据前面计算的结果实例化acceptor线程池。
初始化ServerConnectorManager,管理nio的selector,计算selector的线程数量,经验值是min(4,可用cpu/2)。selector线程一般比acceptor线程多,因为accptor只处理一次,后续操作还需要多次使用selector,但是selector本身不处理具体逻辑,所以也不要太多。
(3) 设置port 监听端口例如8080。
(4)关联server和connector 类似nio操作。
2 Server.start()
(1)设置启动状态
(2)启动过程
1)注册shutDownMonitor,提供一些管理功能例如远程关闭等。
2)获取线程池
3)设置selector数量: 这个数量需要累计所有connector,因为可能存在多个connector。selector大于200就退出。
4)维护bean,例如启动上面线程池;还有WebAppContext,定义一些servlet规范。
5)启动connector: 创建并启动accepter线程和selector线程。
(3)启动结束
3 http请求
(1)accept成功,channel设置为非阻塞模式,配置sokect。正式处理:选择可用的 ManageSelector线程(封装了select操作),后台会维护一个int,每次accept就++,然后取模selector数量,相当于轮询selector线程,做到平均分配,任务会提交到manager的线程安全队列changes中。
(2) ManagerSelector.run(),只要上面提到的selector线程队列中有任务,就开始执行,这一步关联了select和channel。然后进行正式的select(),得到并处理可用的selectkey。
jetty分析的更多相关文章
- Java高并发程序设计学习笔记(十一):Jetty分析
转自:https://blog.csdn.net/dataiyangu/article/details/87894253 new Server()初始化线程池QueuedThreadPoolexecu ...
- Jetty源码分析(一)
一.目的 1.了解jetty组成架构: 2.学习jetty启动过程: 3.学习请求访问过程: 4.学习jetty内各模块作用,学习各模块内部代码: 二.jetty版本 本文所学习的jetty版本为:9 ...
- Jetty 9 源码分析 Connector及Server类(一)
本文的源码基于Jetty9,主要分析了Jetty 的Connector与Server类间在Jetty启动过程中的一些细节.Jetty9 对以前的Connector体系进行了重构, 结构与6和7都不同, ...
- jetty加载spring-context容器源码分析
带着疑问开始 web.xml的顺序问题 先拿一个最简单的spring mvc web.xml来说问题,如下图:如果我将三者的顺序倒置或是乱置,会产生什么结果呢? 启动报错?还是加载未知结果?还是毫无影 ...
- flume jetty 进程关系 flume jetty 跨域问题 jetty 源码分析
flume jetty 跨域问题 13481 httpSource的端口进程号 = flume 启动后的进程号 [root@c log]# netstat -atp Active Internet ...
- Jetty - Connector源码分析
1. 描述 基于Jetty-9.4.8.v20171121. Connector接受远程机器的连接和数据,允许应用向远程机器发送数据. 1.2 类图 从类图看出AbstractConnector继承C ...
- Jetty - Container源码分析
1. 描述 Container提供管理bean的能力. 基于Jetty-9.4.8.v20171121. 1.1 API public interface Container { // 增加一个bea ...
- Jetty - LifeCycle源码分析
1. 描述 基于Jetty-9.4.8.v20171121. LifeCycle主要管理Jetty里面通用组件的生命周期,比如组件启动中.启动.运行.停止中.停止等,实现该接口就可以定义一套生命周期. ...
- Jetty 与 Tomcat 比较,及性能分析
主流java的web容器,主要是Tomcat, jboss, jetty, resin.由于以前我们主要用的是jboss4.0.5,但jbosse用的servlet容器是tomcat5.5,所以只进行 ...
随机推荐
- java数组类Arrays:比较,填充,排序
int i1[] = {1,2,3,4,5,6}; int i2[] = {6,5,4,3,2,1}; //排序 Arrays.sort(i2); System.out.println(i1.equa ...
- 解决CentOS 6环境时区、日期、时间同步方法
有些时候我们在选择的VPS服务商提供的VPS主机方案安装系统.安装建站环境之后就直接上马网站,但是我们会有发现发布的文章或者有些时候设置的自动执行脚本时间与我们实际的时间不符合.甚至有些程序是需要与本 ...
- Uninstall Office 2016 for Mac
官方原文:https://support.office.com/en-us/article/Uninstall-Office-2016-for-Mac-eefa1199-5b58-43af-8a3d- ...
- 2.mysql优化---增删改优化
整理自互联网 补充知识点:操作数据语句优化的认识 通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取 ...
- linux大于2T的磁盘格式化
fdisk默认只能格式小于2T的磁盘,我们经常会碰到大于2T的磁盘,我们不能fdisk 格式化. 我们得用parted 来的格式化 parted 命令可能没有,yum install -y parte ...
- vmem驱动设备
vmem是内存多字符设备.包含vfs的open.read.write.ioctl.poll.fasync和release函数,device文件的读写. virtual_mem.c #include & ...
- UV有问题?
1.检查读取显示贴图的环境与制作贴图环境UV坐标系是否一致. 如:Directx左上角(0,0),右下角(1,1) unity 左下角(0,0),右上角(1,1) 两者互转需要垂直镜像.
- php 服务器的安全笔记
php 服务器的安全笔记 操作系统安全 默认端口修改 MySQL 端口禁止外网访问 用户权限 父进程 子进程 目录权限 TODO Web Server 版本信息 服务器版本信息 PHP 版本 open ...
- spark流程跟踪
每个action对应一个job,每个job里面会有很多个阶段(stage),其实每个stage都是一个算子(Operation),可能是transformation,可能是action:但是actio ...
- 洛谷【P2629】好消息,坏消息
浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://www.luogu.org/problemnew/show/P2629 ...