性能调优之池化

池化技术

  

 

 对象池框架: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,在此值得基础上根据压测结果上下浮动即可

 

posted @ 2020-10-19 18:33  红嘴鲤鱼  阅读(309)  评论(0编辑  收藏  举报