java程序线程数成倍增加——定位线程未被回的BUG
2021-02-23 本文已影响0人
猿气十足
在项目发版前使用
Java VisualVM
监控了项目,观察运行过程CPU、内存、线程,发现了一个问题,重复应用某个功能的时候线程数只增不减
,如果不及时解决最后可能由于内存泄露导致程序崩溃。
发现问题
使用Java VisualVM监控项目
Java VisualVM的启动方法:https://www.jianshu.com/p/5dfd7b405bbf
监视情况
在点击某复杂功能按钮完成后重复执行,监视情况如下图
根据上图线程的监控曲线,一个明显的问题每次点击后活动线程都会增加一倍。
分析问题
定位具体代码
我是采用断点+监控的方式定位,即走一步看一下线程数。
下图是具体的问题代码
线程是由
Executors.newFixedThreadPool(Integer.valueOf(maximumPoolSize))
创建核心线程产生的。每次执行这个任务前都会创建一个连接池,问题就出在创建了但没回收!
解决问题
解决方案
1.创建线程池前先判断是否已经创建,已创建使用创建好的,未创建创建。
2.创建线程池前先判断是否已经创建,已创建回收,之后再创建线程池。
根据实际业务分析我采用了方案2
修改后的代码
image.png验证问题
如下图在重复应用某功能时发现线程不是一味增加存在了回收机制,问题解决。
image.png
总结
1.在使用线程池的时候使用完之后需要考虑回收场景。
2.线程池回收的方法:线程池类调用shutdown()
方法。
2.线程池被回收的同时时也会回收正在执行的任务的线程,此处注意具体场景。