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,所以只进行 ...
随机推荐
- IIS7配置PHP简要说明
1. IIS7 安装的时候 要注意三个地方打得勾 万维网服务->应用程序开发功能->CGI ->ISAPI扩展 ->ISAPI筛选器 注: CGI 会在IIS7+PHP_ ...
- 格式化SQL和逆格式SQL
上篇说过SQLyog中的计算合适数据类型的功能,现在说下Navicat格式化SQL和逆格式化SQL 啥也不说了,一看图,一目了然,Beautify SQL(格式化,即变成最美的语句)和Minify S ...
- iOS 检查指定日期是否在当前日期之前
iOS检查指定日期是否在当前日期之前, 直接上代码: - (BOOL)checkProductDate: (NSString *)tempDate { NSDateFormatter *dateFor ...
- GEF入门实例_总结_03_显示菜单和工具栏
一.前言 本文承接上一节: GEF入门实例_总结_02_新建初始RCP空项目 这一节,我们来给我们的插件加上菜单. 二.基础知识 1.action bar.menubar.coolbar 含义 a ...
- 条款50:使用自定义的new以及delete的时机会
几种最常见的这么做的理由: 1.用来检测运行上的错误:可以在分配的内存空间的起始以及结束分别放置单独的签名 2.为了强化性能 3.为了收集使用上的统计数据 按照第一点就可以举一 ...
- mysqldumpslow使用说明。
mysql慢查询日志分析工具mysqldumpslow. 常用的方法: mysqldumpslow -s c -t 10 /var/run/mysqld/mysqld-slow.log # 取出使用最 ...
- AJAX的最小单元
$(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...
- 常用Request对象获取请求信息
Request.ServerVariables(“REMOTE_ADDR”) ‘获取访问IPRequest.ServerVariables(“LOCAL_ADDR”) ‘同上Request.Serve ...
- Monkey测试与MonkeyRunnner测试的区别
1.Monkey测试 == 压力测试: MonkeyRunner == 自动化测试 2.Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件 3.MonkeyRu ...
- vim编辑 小笔记
http://jingyan.baidu.com/article/495ba8410ff14d38b30ede01.html vim编辑器笔记 1.vi 文件名 打开文件 2.按 i 键 进入inse ...