性能调优之池化
池化技术
对象池框架:commons-pool2
线程池之ThreadPoolExecutor
ThreadpoolExcutor构造方法参数:
1.corepoolsize 核心线程数 ->正式员工
2.maximunpoolsize 最大线程数 ->招聘计划
3.keepalivetime 允许空闲时间(超时会被回收) -> 无所事事的时间
4.timeunit 空闲时间单位
5.workqueue 等待执行的任务,传入BlockingQueue -> 任务规划
6.threadFactory 线程工厂,用来创建线程 -> 人才市场
7.rejectHandler 拒绝任务的策略 -> 如何解聘闲置人员
线程池核心API
操作类
1.execute:提交任务,交给线程池执行
2.submit:提交任务,能够返回执行结果
3.shutdown:优雅关闭线程池,等待任务都执行完
4.shutdownnow:强制关闭线程池,不等待任务执行完(很少使用)
监控类
getTaskCount:返回线程池已执行和未执行的任务总数
getcompletedTaskCount:已完成的任务总数
getPoolSize:线程池当前的线程数量
getActivecount:线程池中正在执行任务的线程数量
线程池状态(注意,是线程池的状态,而不是线程的状态,线程的状态包括:new,runnable,running,blocked,dead)
线程池blockingQueue详解,选择与调优
常见实现
线程池之ScheduledThreadPoolExecutor
核心API
注意scheduledAtFixedRate与scheduleWithFixedDelay的区别,前者每隔几秒执行一次(不包含任务本身执行的时间),后者每执行完一次后等待几秒后再次执行。
线程池之ForkJoinPool
线程池之Executors
阿里规约建议手动创建线程池,原因:创建线程池的时候每个参数都有其意义,使用executor创建的话,默认值在有些时候会造成事故(比如内存溢出)
线程池调优:
1.线程数调优
CPU密集型任务:N+1,N为CPU核心线程数,其中CPU核心线程数可以通过以下代码获取到
IO密集型任务:2N
混合型任务:公式如下,其中WT和ST可以通过jvisualvm获取
2.BlockingQueue调优
期望占用的总内存/单个任务需要占用的内存
池化之连接池
种类:数据库连接池(Hikari,Druid,DBCP2等),redis连接池(Jedis,Redission等),HTTP连接池(HTTPClient,OKHTTP等)
调优:连接数=2N+可用磁盘数,例如8核cpu,1个磁盘,那么连接数为17,在此值得基础上根据压测结果上下浮动即可