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,所以只进行 ... 
随机推荐
- Prism 文档 第三章 管理组件之间的依赖关系
			第3章:管理组件之间的依赖关系 基于Prism库的复合应用程 ... 
- 基于鸿洋博客自定于View实现的android音量调节控件
			1.在values建立attrs.xml,写出你需要的属性: <?xml version="1.0" encoding="utf-8"?> < ... 
- Linux-监控与安全运维之cacti
			一:cacti简介 Cacti 在英文中的意思是仙人掌的意思,Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.它通过snmpget来获取数据,使用 RR ... 
- 2018.7.2 AK22 不良品分析
			a 电路 b 软件 STM32-工业炉温控制器程序 c . layout 不良分析: 1测各模块电压 12V ok 5V ok 3.3V ok 2跟换MCU 给MCU烧程序 ok 3测量MCU晶 ... 
- POJ - 2079:Triangle (旋转卡壳,求最大三角形)
			Given n distinct points on a plane, your task is to find the triangle that have the maximum area, wh ... 
- 洛谷 P2290 [HNOI2004]树的计数
			题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ... 
- 为什么很多公司招聘前端开发要求有 Linux / Unix 下的开发经验?
			知乎: http://www.zhihu.com/question/19666395 
- Sqoop-从hive导出分区表到MySQL
			经多次验证,发现并没有特殊的方法能够直接把多个分区一次性读入,并插入MySQL的方法,以后发现会在此添加. Sqoop只提供了从MySQL导入到HIVE分区表的相关参数,反向并无特别参数. 从HIVE ... 
- Python 函数之定义函数
			在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号: 然后,在缩进块中编写函数体,函数的返回值用return语句返回. 1.定义一个函数 def myfirst( ... 
- Ubuntu 16.04安装Elasticsearch,Logstash和Kibana(ELK)Filebeat
			https://www.howtoing.com/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-16-04 ... 
