问题描述:某仓储系统压测时,发现任务分配worker后台定时处理任务时(积压2个已定位波次,每波次10000订单),ta-worker应用后台抛出”组建集合单异常”,错误信息如下:

2018-10-22 14:09:29[ schedulerFactoryBean_Worker-1:1936704 ] - [ERROR] com.jd.wms.assign.worker.TaskAssignWorker-: - [TaskAssignWorker] {}java.lang.OutOfMemoryError: GC overhead limit exceeded

性能问题诊断-JVM篇(内存泄漏问题)

 

问题分析:通过dump内存堆文件分析,发现类org.quartz.simpl.SimpleThreadPool占用了99%的内存。如下图:

性能问题诊断-JVM篇(内存泄漏问题)

定位到代码段: com.jd.wms.location.dao.impl.ObAssignLocateMDaoImpl.selectSmallByZoneNos
 
性能问题诊断-JVM篇(内存泄漏问题)
 
 
方法 selectSmallByZoneNos 调用相关 SQL
性能问题诊断-JVM篇(内存泄漏问题)
经确认此 SQL 查询出大量数据后存放至 List 对象中,导致应用可用内存不足,产生 OOM  GC overhead limit exceeded
 

优化方案:

减少 ob_locate_d 表中待任务分配数据量,数量控制在 2 个波次内。
优化 方法 selectSmallByZoneNos 涉及 sql (拆分 SQL, 待优化)。
 
优化结果 通过多个波次的任务分配, ta-worker 应用内存未 出现 OOM 现象 。提高了系统稳定性。见下图:
 
 
性能问题诊断-JVM篇(内存泄漏问题)

相关文章:

  • 2021-11-08
  • 2021-08-06
  • 2021-12-14
  • 2021-08-07
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-25
  • 2021-11-25
  • 2022-12-23
  • 2022-01-01
  • 2022-02-11
  • 2021-11-08
  • 2021-11-28
相关资源
相似解决方案