OOM分析之ThreadPoolExecutor

本文探讨了在高并发场景下,由于QRCodeTask对象不断增加导致的内存占用问题。通过对ThreadPoolExecutor的工作原理、参数介绍、Executors类的分析,揭示了内存占用增加的原因。建议通过自定义ThreadPoolExecutor构造函数,调整核心线程数、最大线程数、存活时间和任务队列大小,以避免资源耗尽。文章提供了具体的优化案例,实现了线程池的定制化配置,确保了程序的稳定性和性能。
摘要由CSDN通过智能技术生成

背景

通过单例模式可以有效的减少内存使用。但是随着压测并发数的不断提高,QRCodeTask对象不断增加,内存占用相应也会一直增加。再加上QRCodeTask任务的业务功能是合成图片,属于CPU密集型任务。如果处理的QRCodeTask任务太多,会一直占用CPU,造成其它接口响应的速度变慢。

因此可以对ThreadPoolExecutor深入研究来找到进一步优化的措施。

Java SE API文档链接如下:

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

二.ThreadPoolExecutor介绍

1.构造函数解析

通过查看源码可以看到所有不同形参的构造函数最终都会调用到以下的构造函数。

public ThreadPoolExecutor(int corePoolSize,
                  int maximumPoolSize,
                  long keepAliveTime,
                  TimeUnit unit,
                  BlockingQueue<Runnable> workQueue,
                  ThreadFactory threadFactory,
                  RejectedExecutionHandler handler)

2.参数介绍

corePoolSize:线程池中核心线程数目,即使空闲也不回收,除非设置了allowCoreThreadTimeOut时间。当有新增任务且当前线程数小于corePoolSize时,会继续创建核心线程执行任务。当线程数达到corePoolSize时,后面新增任务都会加入到BlockingQueue队列中等待执行。

maximumPoolSize:线程池中永许达到的最大线程数母。如果BlockingQueue队列满,且当前线程数小于maximumPoolSize,则线程池会创建新的临时线程继续执行后续任务,直到线程数目达到maximumPoolSize。如果BlockingQueue使用了无界队列,此参数设置了也没有实际意义。

keepAliveTime:临时线程空闲后的存活时间,超时后空闲线程会被销毁。

unit:keepAliveTime的时间单元。单位有天(DAYS

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值