tomcat线程池有如下参数:
maxThreads, 最大线程数,tomcat能创建来处理请求的最大线程数
maxSpareTHreads,
最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若空闲时间大于
最大空闲时
间,则回收,小于则继续存活,等待被调度。
minSpareTHreads,最小空闲线程数,无论如何都会存活的最小线程数
acceptCount, 最大等待队列数 ,请求并发大于tomcat线程池的处理能力,则被放入等待队列等待被处理。
maxIdleTime, 最大空闲时间,超过这个空闲时间,且线程数大于最小空闲数的,都会被回收
1.一张图看懂tomcat线程池。
tomcat原理如上图。Tomcat线程池在工作的时候,实际情况是:以上述线程池为例,一开始就创建最小空闲数的线程在池里,20个,当同一时间请求数量大于最小空闲数20,比如来了50个并发请求,那么线程池还需要创建30个线程来处理请求。这时候当请求都处理完了,持续来的请求低于50个的时候,那么当时间过了60秒,并发数还是没有达到50,那么从第50个线程开始,线程池将按照,空闲时间达到60s的,开始逐个回收,49个,48个,47个,如此回收。如果并发请求小于20个,那么线程池会回收至20个的时候,停止回收,这就是最小空闲数的作用,即使一个请求都没有,那么线程池也得保证随时都有20个。所谓空闲回收是指:一个线程在60s的时间内,一直处于等待。那么就可以判定该线程是空闲。如果这个空闲线程是在最小空闲数以上,则会被回收。当请求并发高于500最大空闲数的时候,线程池是会继续创建线程的,来满足特大突发性并发。当并发请求数降下之后,线程池中有空闲,那么,无论线程空闲时间是否达到60s,线程池都会进行回收至500。500以类的线程也会根据空闲时间是否大于60s来判断是否需要进行回收。
2.下面我们详细结合实际情况来阐述tomcat线程池在实际运用中,是如何工作的,如何处理并发的。
可以结合这个来看,最高的线程如果是繁忙的话,那么说明tomcat线程已经被打满了。
在短时间周期内,如果线程数忽然持续走高,说明有突发性请求已经打过来,且正在创建更多的线程去执行,这时候创建线程的过程中,请求处于被等待,越是最后的请求被等待的时间越长。而过一段时间,线程数降下去很多的话,说明突发性请求已经过去了,线程池里的线程空闲时间达到了最大空闲时间,比如60s,那么即将被回收。
我个人觉得,这种现象应该被归属于不健康状态。因为请求来了,如果等待的线程只有10个以下,那么等待时间不会太长。但是如果等待时间达到10个以上,等待时间就会呈几何方式上升的,且线程处理时间也会呈几何倍数上升,因为同一个线程池里的线程之间要相互竞争CPU资源,比如现在tomcat运行中有1000个线程,假如每个CPU的时间片为0.01秒,那么,轮到第1000个线程执行时,该线程实际已经等待了999个时间片*0.01=1秒了,这还只是一次时间片执行,0.01秒相当于10ms,而咱们的一个请求正常情况下的时间是:30ms,那一个请求要成功就需要等待3次cpu时间片来执行,如果tomcat线程池一直有1000个在运行,那正常情况下一个请求的执行时间应该是:0.03+999*0.01*3=3.03s,可想而知,执行一个请求只需要30ms,可是却要等待需要3s,这是相当不靠谱的且难以接受的。再假如,时间片是20ms,那么一个请求从进入等待到执行完毕的执行时间应该是多少?0.03+999*0.02*(0.03/0.02=取大于整数=2)+CPU切换时间a*999次=4.03s+999a,这已经很夸张了吧!
咱们还可以理想一点,加入线程池里只有500个活跃线程,那么上面的公式应该是:当cpu时间片为0.01s时,最后一个请求需要处理成功,需要用时:0.03+500*0.01*3= 1.53s,当cpu时间片为0.02s时,最后一个请求需要处理成功,需要用时:0.03+500*0.02*2= 2.03s,当cpu时间片为0.03s时,最后一个请求需要处理成功,需要用时:0.03+500*0.03*1= 1.53s。
但是这只是cpu执行时间,还要加上网络传输,创建线程时间,cpu切换线程所需时间,还有其他时间,总共加起来,就是一个很可怕的时间了。所以,即使tomcat有线程池,但最好不要总是超过最小空闲数,这是最优的情况,最次的情况就是tomcat线程池中线程数超过最大空闲数了,线程们总是繁忙地工作,宕机随时有可能。
而健康状态是:线程池保持最小空闲数才算是健康,如果你的tomcat线程数总是超过最小空闲数,那么你的程序随时都处于繁忙状态,这时候出错的几率已经大大增加。是时候需要被重点关注了。
以上,仅个人观点,具体情况还得实际分析。还需要考虑Cpu个数性能,网络,操作系统,实例是否混部,应用类型是cpu密集还是IO密集,等等都会引起差异化。
1.工作机制:Tomcat启动时如果没有请求过来,那么线程数(都是指线程池的)为0;一旦有请求,Tomcat会初始化minSapreThreads设置的线程数; 2.线程池作用:Tomcat的线程池的...
来自:
@凭栏
原理:在使用和配置tomcat的线程池之前明白线程池的原理,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠 状态,当客户端有一个新请求时,就会唤醒线程池中的...
来自:
zhangvalue的博客
我们在上一部分文章里已经看到了,Tomcat的架构是如何一步步构建出来,但是在后台服务器的构建中,一个很重要的问题是如何实现多线程?一般情况下,如果我们来实现最初步的想法就是:不断循环接收客户端的连接...
来自:
站在人文与技术的交汇点
本文前半部分结论存在严重错误,请看最后2015-1-20更新部分。 最近一直在解决线上一个问题,表现是:Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满...
来自:
weixin_33768481的博客
1. 简介Tomcat继承并重写了JAVA原生的java.util.concurrent.ThreadPoolExecutor,增加了一些更有效率的方法,并且默认拒绝策略为RejectedExecut...
来自:
860MHz的专栏
如题, tomcat6设置线程池后,并发仍然很低,只有可怜的4个,设置的不对吗,还是与数据库访问有关,前边有大量的select操作,后边有一个 update, 一个insert tomcat6 ser
一、背景线程池的优点,以及核心参数是面试的重点。在工作中也经常用到,大多人就看着之前源码怎么写copy一份就完事,没有深入得思考过为啥这样。还有就是核心线程池参数理解可能不太透彻。本文介绍使用线程池的...
来自:
明明如月的专栏
1、进入apache-tomcat/conf路径,修改server.xml文件2、注释如下的原始配置<Connector port="8080" protocol=&...
来自:
rzrenyu的博客
一、线程池简介1.底层都是ThreadPoolExecutor实现2.3.核心线程数corePoolSize:线程池的常驻核心线程数4.maximumPoolSize线程池能够容纳同时执行的最大线程数...
来自:
qq_30906199的博客
以Tomcat8为例配置方式一 <Connector port="8080" acceptCount="100" maxConnections="200" minSpar...
来自:
我是一只胖子丶的博客
描述BIO阻塞式IO,采用传统的javaIO进行操作,该模式下每个请求都会创建一个线程,适用于并发量小的场景NIO同步非阻塞,比传统BIO能更好的支持大并发,tomcat8.0后默认采用该模式APR...
来自:
fd2025的博客
本文讲述了Tomcat的常见线程的功能、名称、线程池和配置等信息,其中源码来自于Tomcat 6.0.18。Work线程功能HTTP请求的处理线程(非NIO)。当有新的http请求进来后,则会从线程池...
来自:
chw0629的博客
每个请求到tomcat服务器,他都会开一个线程,那么如果某个用户请求进来后,做了一个操作A,这个操作要很长时间才能执行完,所以代码中对其进行了处理,即new了一个线程出来,让线程去执行。现在我想问的是new 出来的这个线程和tomcat服务器的线程有没有关系,也就是说本来tomcat线程池中最多只能连接五百个请求,现在有200个人进来了,那么还剩三百个,两百个人同时执行了该操作A,是不是意味着tomcat只剩下100个线程可以用了
1. tomcat 启动一个应用是多线程的吧 ? 2. 比如现在有一个HelloWord的web应用, 用tomcat部署。tomcat是不是以多线程的方式启动这个应用,意思是同时可以多个用户(比如5
大家好! 如题, Tomcat并发,多线程,怎么处理同一个链接(映射到同一个方法),是开两个线程等待?还是同步(这样是不是就不安全了)?? 1. 同一个地址,映射到同一个方法,如果一个线程处理,或者两
tomcat多线程处理及ThreadLocal使用注意tomcat默认使用线程池来管理线程,即当收到一个请求时,如果线程池存在空闲线程,则会从中取出一个空闲线程来处理该请求。当一个线程在处理请求时,其...
来自:
weixin_42168940的博客
【resin】 resin3 线程池与IO模型(1)本文所讨论的线程池及IO是基于resin3.1.13开源版resin3的线程池IO相关的类主要是3个:Port、TcpConnection、Thre...
来自:
Runtime.class
1.我刚做jsp我想知道tomcat处理页面请求时是不是一个请求就开启一个线程来处理? 2.现在用的是spring的架构controler类里面的函数修改一个全局资源是不是要加锁呢? 3.spring
一、ThreadPoolExecutor的相关属性private final BlockingQueue workQueue; // 任务阻塞队列private final ...
来自:
pfnie的博客
我研究了半天也没有解决,请问一个请求时会产生一个线程吗?(我之前一直这么以为的)...但我去获取线程id或name时候发现不是的。然后网上也有些人说不是的,因为有线程池,他在服务器启动的时候就会先创建几个线程。那我就是有迷茫了,那我们之前用的ThreadLocal,如果不是每次请求都会产生一个线程,有些可能不同的请求用的是同一个线程,那ThreadLocal不是失去它的意义了????求解
1. 目的通过优化tomcat提高网站的并发能力。当我们今天我们将这个优化讲完之前 优化完成后看能达到什么层次。 2. 服务器资源服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬...
来自:
横纲
tomcat不用说,java做web比较经典的一款服务器,本片继上篇servlet详解及Tomcat中多线程下的Servlet(1)对Tomcat7和Tomcat8线程分配策略进行测试 一,设置tom...
来自:
小鼠标的博客
tomcat7默认就是线程池,默认最小10,最大是200;配置Connector参数:(1)maxThreads:tomcat可用于请求处理的最大线程数(2)minSpareThreads:线程池的最...
来自:
weixin_34252090的博客
目录前言 环境搭建 目的 服务器资源 优化配置 禁用AJP连接器前言基于Tomcat 7,通过调其内部参数,提高tomcat性能。0、环境搭建参考:在一台服务器上配置多个Tomcat 教程 http...
来自:
py_tamir的博客
前言:Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题...
来自:
kakajw的专栏
如下,都是以 catalina-exec-开头的,大概有200个线程,都处于这种状态, "catalina-exec-484" daemon prio=10 tid=0x0000002c0b3e540
目录前言一、Nio、Bio、APR1、Connector的protocol2、如何指定protocol3、BIO/NIO有何不同二、3个参数:acceptCount、maxConnections、ma...
tomcat 6的Connector配置如下<Connector port="8080" protocol="HTTP/1.1" connectionTimeout=...
来自:
weixin_30954607的博客
对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。tomcat会维护一个线程池,每一个http请求,会从线程池中取出一个空闲线程。线程池作为提高程序处理数据能力的一...
来自:
rogerxue12345的博客
Tomcat线程池目前出现过三种,第一个是5.0的线程池模型,这个线程池目前在6.x的版本还存在,主要是用于AJP的,第二个是5.5.x时代使用了一仲线程池第三个是6.x版本的线程池,实际上这个不是t...
来自:
hixiaoxiaoniao的专栏
本文主要是记录一下面试字节跳动的经历。
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直...
福利来了,给大家带来一个福利。
最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完...
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次...
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,...
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~)
one 樱花树
动态...
HashMap 相关概念
HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自Abstrac...
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频...
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢...
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级
1 标识符
标识符是编程时使用的名字,用于给变量、函数、...
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并...
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。
餐厅的约会
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问...
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔...
在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很...
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。
声明:本文不会下关于Mybatis和JPA两个持久层框架...
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所...
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。
区块链技术被认为是继蒸汽机、...
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。
本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法...
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估...
数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。
典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。
关系型数据库:使用关系模型把数据...
王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。
准备工...
在操作系统这门课程中,对进程的定义是这样的:
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机...
其实你可以不必Redis exis...
li396864285:
[reply]OuDale[/reply]这个情况是显然存在的,因为exist和get两个请求之间存在时间间隔,且两个操作非原子性,不具备一致性。高并发时,同时对key频繁set和remove时,复现率极高
其实你可以不必Redis exis...
OuDale:
-- “我想问下在多线程和分布式情况下有没有可能在exist时key是存在的,然后到下一句get前key被删掉了呢?如果有这种情况,是不是直接get,不用先调用exist就行呢”
这种情况应该不只是多线程的情况下回出现,普通情况下,由于redis惰性删除的特性,也可能exists 为ture ,get时却为null了;
Idea编辑器打开现有项目,JDK...
u010349629:
感谢分享。
java中如何理解overload...
daimidaimi:
牛逼