小程的小马同学 2023-04-21 15:28 采纳率: 25%
浏览 13
已结题

项目出现大量ThreadPoolExecutor线程的问题

线上只要运行一段时间就会出现接口访问缓慢甚至假死的情况,用arthas查看线程数显示有一万多个线程在等待.查看线程dump全都是ThreadPoolExecutor线程池的线程.可是项目里没有显式使用的地方,希望可以给一个排查思路

img

img

  • 写回答

3条回答 默认 最新

  • 晓亮. 2023-04-21 15:39
    关注

    你的这个问题可能是由于线程池的参数设置不合理或者使用了无界队列导致的。你可以尝试以下几个排查思路:

    • 检查你的项目中是否使用了Executors类的newFixedThreadPool或newCachedThreadPool方法来创建线程池,这些方法可能会导致OOM或者任务堆积。建议使用ThreadPoolExecutor的构造函数来创建线程池,并根据业务场景来设置corePoolSize、maximumPoolSize、workQueue等参数。

    • 注意检查项目中是否使用了局部线程池,即在方法内部创建线程池并执行任务。这样可能会造成系统资源耗尽,因为任务执行完后没有执行shutdown()方法或有其他不当引用。可以将线程池定义为全局变量或者单例模式,并在合适的时机调用shutdown()方法。

    • 还有就是检查项目中是否给线程池指定了有意义的名称,方便出错时回溯。可以使用ThreadFactoryBuilder来构造ThreadFactory,并给不同类别的业务用不同的线程池。

    • 看看你是否使用了无界队列,如LinkedBlockingQueue,如果使用来作为线程池的工作队列。这样可能会导致大量新任务在队列中堆积,最终导致OOM。建议你使用有界队列,如ArrayBlockingQueue或PriorityBlockingQueue,并根据任务类型和数量来合理设置队列大小。

    • 检查项目中是否合理设置了线程池的核心线程数和最大线程数。这两个参数需要根据CPU核心数、CPU目标利用率、任务类型、任务等待时间和计算时间等因素来计算。一般来说,对于CPU密集型任务,核心线程数等于CPU核心数;对于IO密集型任务,核心线程数等于CPU核心数乘以一个系数(通常为2)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 4月21日

悬赏问题

  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)