在近期的性能优化中,使用了线程池,线程池的定义如下:
ExecutorService executorService = new ThreadPoolExecutor(threadPoolSize,
threadPoolMaxSize, timeout,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(30000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
现有55000个请求,大概在发送30000零几个请求的后,就不在发送请求了。countdownLuch也不做减法了。
原因是ThreadPoolExecutor 中的 new LinkedBlockingQueue<>(30000),即阻塞队列为30000个,在往线程池中塞请求的时候,塞的请求多余3W个时候,因为我使用的是ThreadPoolExceutor默认的拒绝策略。所有其他的1W多个都抛弃了。
为什么不是整整3W,而是3W零几个呢,因为最初发送的几个请求返回了结果,释放了几个线程,在3W个队列塞满之前,又多加了几个进去。
===============
问题的定位
最初的猜猜是 1。出现了死锁 ,使用jps -m 查看死锁(参考这篇文章),也可以使用jstack PID 查看(