美文网首页
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

    在项目发版前使用Java VisualVM监控了项目,观察运行过程CPU、内存、线程,发现了一个问题,重复应用某个...

  • java线程入门基础(二)

    java线程入门基础(二) 一、认识Java里的线程 1.1 Java里的程序天生就是多线程的 一个Java程序从...

  • FixedThreadPool

    java.util.concurrent.Executors 核心线程数== 最大线程数(没有救急线程) 队列无界...

  • 带你搞懂Java多线程(二)

    带你搞懂Java多线程(一) Java里的线程 Java里的程序天生就是多线程的 启动线程的方式 ①扩展Threa...

  • 4. Java并发编程基础

    Java多线程 Java程序的运行是main线程和多个其他线程的同时运行,包括JVM内部线程 使用多线程的原因:更...

  • Java多线程

    Java多线程 1. 进程与线程 线程:程序中单独的控制流线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使...

  • Java基础知识10-多线程2

    主线程 当java程序启动时,会立即运行一个线程,因为它是程序开始时执行的线程,所以这个线程通常称为程序的主线程。...

  • 「性能优化3.1」Android多线程优化

    多线程优化 给线程起名字 目的是什么? 在出 bug 时方便定位到是哪个线程出问题。 在 Android SDk ...

  • Java中如何正确的创建线程数量

    问题 java开发中,线程数通常定义为:线程数 = Runtime.getRuntime().availableP...

  • 2020-09-15 Java线程安全

    一、线程安全简介 单线程程序不会产生线程安全问题。多线程程序没有访问共享数据,也不会产生问题。多线程程序访问共享数...

网友评论

      本文标题:java程序线程数成倍增加——定位线程未被回的BUG

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