Tomcat 的线程池实现原理
2023-09-27 14:19:47 时间
既然选择先扩容线程池再加入队列,为何不干脆把核心线程数设置很大,然后核心线程数可回收?
其实我们希望尽量确保有足够多的线程能处理任务,但又不闲置过多线程,或临时创建过多线程,即让线程的创建和回收都不要太频繁。选择哪个策略要根据任务的性质和压力的流量形态来决定。
复用线程池,任务很慢,主线程get结果时,不会导致主线程卡死的状态吗?不是提倡不同任务用不同线程池吗,那复用与不复用的边界在哪里呢?
复用线程池是指不每次都创建线程池,线程池必须复用而非按需创建,但不推荐一味混用一个线程池。对于选择是否混用线程池,至少对于频+快的任务和少+慢的任务应该分开,还是要根据实际任务的性质来选择
如果我们不小心每次都创建了这样一个自定义的线程池(10核心线程,50最大线程,2秒回收),反复执行测试接口线程,最终可以被回收吗?会出现OOM吗?
ThreadPoolExecutor回收不了,可以看看其源码,工作线程Worker是内部类,只要它活着,换句话说线程在跑,就会阻止ThreadPoolExecutor回收,所以其实ThreadPoolExecutor是无法回收的,并不能认为ThreadPoolExecutor没有引用就能回收
我觉得不会被回收且很快就会OOM了,因为每次请求都新建线程池,每个线程池的核心数都是10, 虽然自定义线程池设置2秒回收,但是没超过线程池核心数10是不会被回收的, 不间断的请求过来导致创建大量线程,最终OOM。
Exception in thread “main” java.lang.OutOfMemoryError: unable to create new native thread
- https://stackoverflow.com/questions/19528304/how-to-get-the-threadpoolexecutor-to-increase-threads-to-max-before-queueing
相关文章
- tomcat优化---大数据量提交tomcat时,tomcat无法接收导致页面无反应
- TomCat之Filter小析
- 解决tomcat startup.bat启动时一闪即过问题
- tomcat管理员在远程(不同)机器上访问管理页面
- Tomcat服务的部署与安全调优
- 《JavaWeb篇》07. HTTP&Tomcat&Servlet看这一篇就够了
- Docker 安装配置Tomcat
- Jenkins 部署到Tomcat
- tomcat配置SSL
- Tomcat最大线程数、最大连接数、超时时间及高效配置
- 三步搭建本地服务器 -- Apache Tomcat
- tomcat的NIO线程模型源码分析
- 在同一台电脑部署jdk1.6和jdk1.8共存,2个Tomcat服务共存
- Enable Access Logs in JBoss 7 and tomcat--转
- 曹工说Tomcat:200个http-nio-8080-exec线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)