默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200)。在大多数情况下你不需要改这个配置(除非增大最大线程数以满足高负载需要)。但是 Tomcat 喜欢在每个工作者线程的 thread-local 上下文缓存一些诸如 PageContext 以及标签缓存的对象。正因如此,就会有你期望 Tomcat 能够将线程关掉以清理出来一些内存的情况。此外,每个连接器维护自己的线程池的话,根据服务器的承受能力来设置一个(线程数)最高值会变得更加困难。解决这些问题的答案就是使用一个共享执行器。
通过让所有的连接器都使用同一个共享的执行器,你可以预先对的整个应用能够承载的最高并发请求数进行相关配置。执行器也让线程池具备了闲时收缩忙时扩展的功能。至少在理论上是这样的...
org.apache.catalina.core.StandardThreadExecutor
Tomcat 默认所使用的标准、内置执行器就是 StandardThreadExecutor。配置文档访问:http://tomcat.apache.org/tomcat-6.0-doc/config/executor.html。这些配置选项里有个取名不当的参数 "maxIdleTime",以下是关于标准执行器和空闲线程的关闭你需要了解的一些事情。
标准执行器内在地使用了一个 java.util.concurrent.ThreadPoolExecutor。它通过具有一个变量大小的工作线程的线程池进行工作,一旦这些线程完成了一个任务,将会等待一个阻塞队列,直到一个新的任务进来。或者直到它等待了一个设定的时间,这时将会 "超时",该线程将被关闭。这里边的关键点是第一个完成了一个任务的线程会首先被分配新的任务,线程池遵守一个先进先出(FIFO)的模式。在我们检查它将如何影响 Tomcat 执行器的时候我们需要时刻注意这一点。
maxIdleTime 实际上是 minIdleTime
由于 Java ThreadPoolExecutor 的 FIFO 行为,每个线程在可能被关闭之前会等待最少 "maxIdleTime" 时间来接受新的任务。此外,还是由于线程池的 FIFO 的行为,因为最先进入空闲状态的线程会被优先分配新任务,所以在它被关闭之前它最少也要等待 maxIdleTime  没有任何请求进入的时间。这个的影响是执行器实际上无法为线程池设置适合平均负载(并发请求)的大小,它会更加请求进入的速度来调配这个大小。这看起来好像没啥差别,但是对于 web 服务器来讲,影响可就大了。举个例子,同一时间进来了 40 个请求。线程池将扩展到 40 以适应该负载。之后的一段期间,同一时间只进入了一个请求。比方说每个请求的执行结束需要 500 ms,这就意味着在接下来的这段时间内,需要 20 秒才能把整个线程池里的线程执行一遍(记住,FIFO)。除非你把你的 maxIdleTime 设置到 20 秒以内,否则线程池将会一直持有 40 个线程,即使你的并发量从未超过 1。然而你也并不想把你的 maxIdleTime 设置的太小 - 这将导致你面临线程被关闭的太快的风险。
结论
为了匹配平均负载,而不是一个请求进入的比率的话,要得到一个可以预期的线程池行为,比较合适的是执行器应该基于一个后进先出(LIFO)的模式。如果线程池能够将最小等待空闲的线程来优先分配进入的任务的话,服务器就能够在较低负载阶段更好地关闭线程(以一个更加可以预测的方式)。在上面那个再简单不过的例子中,初始负载为 40 之后一段时间的负载维持在 1,一个 LIFO 的线程池就能够在 maxIdleTime 阶段之后将大小合理地调整到 1。当然,并非总是要求你使用这种策略,但是如果你的目标是把 Tomcat 所持有的资源最小化,很不幸的是标准的执行器可能就不是你所期望的那样了。
原文链接:https://papweb.wordpress.com/2010/10/30/understanding-tomcat-executor-thread-pooling/

关于 Tomcat 的线程池的理解的更多相关文章

  1. 每天都在用,但你知道 Tomcat 的线程池有多努力吗?

    这是why的第 45 篇原创文章.说点不一样的线程池执行策略和线程拒绝策略,探讨怎么让线程池先用完最大线程池再把任务放到队列中. 荒腔走板 大家好,我是 why,一个四川程序猿,成都好男人. 先是本号 ...

  2. 【Java面试】简述一下你对线程池的理解?

    到底是什么面试题, 让一个工作了4年的精神小伙,只是去参加了一场技术面试, 就被搞得精神萎靡.郁郁寡欢! 这一切的背后到底是道德的沦丧,还是人性的扭曲. 让我们一起揭秘一下这道面试题. 关于, &qu ...

  3. 线程和线程池的理解与java简单例子

    1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...

  4. tomcat使用线程池配置高并发连接

    1:配置executor属性打开/conf/server.xml文件,在Connector之前配置一个线程池:[html] view plain copy<Executor name=" ...

  5. java线程池初步理解

    多线程基础准备 进程:程序的执行过程,持有资源和线程 线程:是系统中最小的执行单元,同一个进程可以有多个线程,线程共享进程资源 线程交互(同步synchronized):包括互斥和协作,互斥通过对象锁 ...

  6. Linux下线程池的理解与简单实现

    首先,线程池是什么?顾名思义,就是把一堆开辟好的线程放在一个池子里统一管理,就是一个线程池. 其次,为什么要用线程池,难道来一个请求给它申请一个线程,请求处理完了释放线程不行么?也行,但是如果创建线程 ...

  7. android中对线程池的理解与使用

    前段时间有幸接到腾讯上海分公司的 Android开发面试,虽然最后一轮被毙了.但还是得总结一下自己在android开发中的一些盲点,最让我尴尬的是面试官问我几个android中线程池的使用与理解..哎 ...

  8. 对于Android的线程和线程池的理解

    Android的消息机制,主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue 和 Looper的支撑,MessageQueue中文名消息队列,它的内部存储了一组消 ...

  9. 干货,阿里P8浅谈对java线程池的理解(面试必备)

    线程池的概念 线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免创建过多线程来减少系统资源消耗和竞争,确保任务有序完成:ThreadPoolExecutor ...

随机推荐

  1. The length of the string value exceeds the length configured in the mapping/parameter.

    在NHibernate 3.3 中存储的字符串太长,会抛异常:The length of the string value exceeds the length configured in the m ...

  2. 使用maven编译Java项目 http://www.tuicool.com/articles/YfIfIrq

    使用maven编译Java项目 时间 2014-07-17 17:42:37  Way Lau's Blog 原文  http://www.waylau.com/build-java-project- ...

  3. 使用 trash-cli 逃出 rm 命令误删除重要文件的阴影

    今天是一个难忘的日子,当时本来想清除我们公司网站cms目录下面一些cdn推送网页后残留的垃圾文件,结果在执行rm -rf conten* 时打成了rm -rf conten *结果就悲剧了.cms目录 ...

  4. Orchard源码分析(4.1):Orchard.Environment.CollectionOrderModule类

    CollectionOrderModule类是一个Autofac模块(Module,将一系列组件和相关的功能包装在一起),而非Orchard模块.其作用是保证多个注册到容器的组件能按FIFO(Firs ...

  5. Memcached基础知识

    主要内容: Memcached基本的工作原理 Memcached的两阶段哈希 Memcached的数据存储方式 Memcached新建Item分配内存过程 Memcached的数据过期方式 Memca ...

  6. Nginx 502 bad gateway问题的解决方法

    Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,一般来说Nginx 502 Bad G ...

  7. poj3070 Fibonacci

    Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...

  8. zookeeper集群配置与启动——实战

    1,准备: A:三台linxu服务器: 10.112.29.177 10.112.29.172 10.112.29.174 命令 hostname 得到每台机器的 hostname vm-10-112 ...

  9. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  10. Ubuntu下安装php7后无法启动Apache

    报错提示:Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You nee ...