美文网首页
java程序线程数成倍增加——定位线程未被回的BUG

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

作者: 猿气十足 | 来源:发表于2021-02-23 11:24 被阅读0次

    在项目发版前使用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

          本文链接:https://www.haomeiwen.com/subject/xuqotltx.html