java程序线程数成倍增加——定位线程未被回的BUG

在项目发版前使用Java VisualVM监控了项目,观察运行过程CPU、内存、线程,发现了一个问题,重复应用某个功能的时候线程数只增不减,如果不及时解决最后可能由于内存泄露导致程序崩溃。


发现问题

使用Java VisualVM监控项目

Java VisualVM的启动方法:https://www.jianshu.com/p/5dfd7b405bbf

监视情况

在点击某复杂功能按钮完成后重复执行,监视情况如下图

1612592371(1).jpg

根据上图线程的监控曲线,一个明显的问题每次点击后活动线程都会增加一倍

分析问题

定位具体代码

我是采用断点+监控的方式定位,即走一步看一下线程数
下图是具体的问题代码

image.png

线程是由Executors.newFixedThreadPool(Integer.valueOf(maximumPoolSize))创建核心线程产生的。
每次执行这个任务前都会创建一个连接池,问题就出在创建了但没回收!

解决问题

解决方案

1.创建线程池前先判断是否已经创建,已创建使用创建好的,未创建创建。
2.创建线程池前先判断是否已经创建,已创建回收,之后再创建线程池。
根据实际业务分析我采用了方案2

修改后的代码

image.png

验证问题

如下图在重复应用某功能时发现线程不是一味增加存在了回收机制,问题解决。


image.png

总结

1.在使用线程池的时候使用完之后需要考虑回收场景。
2.线程池回收的方法:线程池类调用shutdown()方法。
2.线程池被回收的同时时也会回收正在执行的任务的线程,此处注意具体场景。

你可能感兴趣的:(java程序线程数成倍增加——定位线程未被回的BUG)