根据线程数设置公式
- 最大线程数就是性能最高线程数
- 因为此时性能已经是最高,再设置比他大的线程数反而性能变低,没有意义
- 估算最大流量,合理设置阻塞队列长度
核心线程数也是基于性能考虑
- 估算平时的流量需要的线程数,设置核心线程数
根据线程数设置公式
- 最大线程数就是性能最高线程数
- 因为此时性能已经是最高,再设置比他大的线程数反而性能变低,没有意义
- 估算最大流量,合理设置阻塞队列长度
核心线程数也是基于性能考虑
- 估算平时的流量需要的线程数,设置核心线程数
转载于:https://my.oschina.net/u/3847203/blog/3099313
线程池策略
corePoolSize:核心线程数;maximunPoolSize:最大线程数
每当有新的任务到线程池时,
第一步: 先判断线程池中当前线程数量是否达到了corePoolSize,若未达到,则新建线程运行此任务,且任务结束后将该线程保留在线程池中,不做销毁处理,若当前线程数量已达到corePoolSize,则进入下一步;
第二步: 判断工作队列(workQueue)是否已满,未满则将新的任务提交到工作队列中,满了则进入下一步;
第三步: 判断线程池中的线程数量是否达到了maxumunPoolSize,如果未达到,则新建一个工作线程来执行这个任务,如果达到了则使用饱和策略来处理这个任务。注意: 在线程池中的线程数量超过corePoolSize时,每当有线程的空闲时间超过了keepAliveTime,这个线程就会被终止。直到线程池中线程的数量不大于corePoolSize为止。
(由第三步可知,在一般情况下,Java线程池中会长期保持corePoolSize个线程。)饱和策略
当工作队列满且线程个数达到maximunPoolSize后所采取的策略
AbortPolicy:默认策略;新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获。
CallerRunsPolicy:既不抛弃任务也不抛出异常,使用调用者所在线程运行新的任务。
DiscardPolicy:丢弃新的任务,且不抛出异常。
DiscardOldestPolicy:调用poll方法丢弃工作队列队头的任务,然后尝试提交新任务
自定义策略:根据用户需要定制。
1.查看服务器系统允许的最大线程数
ulimit -a
2. 修改配置文件
vi /etc/security/limits.d/90-nproc.conf
可以修改允许最大的线程数
3.查看当前系统比较好资源的线程
top -H
4.ps -ef|grep tomcat (查看tomcat进程)如tomcat pid进程号为 5750ps -Lf |wc -l -f 为全格式形式 wc为管道命令 word count 统计 -l 为统计行数
5.查询当前整个系统已用的线程或进程数
pstree -p|wc -l
3,4为排查当前系统某个进程下的线程数,进而和5比较是否超出了当前系统允许的最大线程数,防止系统开辟不出新的线程,进而web应用抛出了can not create a native thread 的异常
6.top -p pid 动态查看某个进程的资源消耗情况
1.查看服务器系统允许的最大线程数
ulimit -a
2. 修改配置文件vim /etc/security/limits.d/20-nproc.conf # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc 4096 # 所有的用户默认可以打开最大的进程数为 4096 root soft nproc unlimited # root 用户默认可以打开最大的进程数 无限制的。
可以修改允许最大的线程数
3.查看某个进程内部线程占用情况分析
top -H -p pid
4.ps -ef|grep tomcat (查看tomcat进程)
如tomcat pid进程号为 27988
ps -Lf |wc -l
为全格式形式 wc为管道命令 word count 统计 -l 为统计行数# ps -Lf 27988|wc -l 678
5.查询当前整个系统已用的线程或进程数
pstree -p|wc -l
# pstree -p|wc -l 946
3,4为排查当前系统某个进程下的线程数,进而和 5 比较是否超出了当前系统允许的最大线程数,防止系统开辟不出新的线程,进而web应用抛出了can not create a native thread 的异常
6.
top -p pid
动态查看某个进程的资源消耗情况