慧销平台ThreadPoolExecutor内存泄漏分析

💡 原文中文,约5800字,阅读约需14分钟。
📝

内容提要

京东生旅平台慧销系统排查发现内存泄漏是因为每次执行worker都会创建新的线程池,但是局部创建的线程池没有被关闭,导致内存中的线程池越来越多,未被GC回收。解决方案是只初始化一次线程池,每次执行worker复用线程池。

🎯

关键要点

  • 京东生旅平台慧销系统发现内存泄漏问题,内存持续升高。
  • 内存泄漏的初步判断与线程池的不当使用有关,线程数不断上升。
  • 通过JStack分析发现线程池创建的线程数过多,达到7000+。
  • 代码中每次执行worker都会初始化新的线程池,未关闭导致内存中线程池数量增加。
  • 验证局部线程池未关闭时不会被GC回收,线程数量持续增加。
  • 解决方案是只初始化一次线程池,复用线程池,避免内存泄漏。
  • 监控结果显示内存不再持续上升,线程池数量恢复正常。
  • 线程池提供shutdown和shutdownNow两种关闭方法,分别用于等待任务完成和立即关闭。
  • 局部未关闭的线程池对象因存在引用关系,无法被GC回收。
➡️

继续阅读