解决线程异常WAITING(parking)问题

 更新时间:2024年11月15日 08:47:13   作者:夷则sail  
文章总结:在项目中线程数量持续增长无法回收,导致服务器卡死和内存不足,通过分析发现是由于自定义线程池未执行shutdown()关闭导致线程泄漏

线程异常WAITING(parking)

现象

在项目中线程数量持续增长,且基本无法回收关闭,线程数量一直累积达到几万,影响CPU开销和性能,导致服务器卡死,连接上服务器后输入指令提示“无可分配内存”。

查找原因

1.通过ps -eLf|grep '容器名'|wc -l命令找到项目的所占的线程数异常庞大,通过top -p pid H也发现该进程下大量占用资源的线程。

进入容器内查看堆栈信息。

2.通过**jstack -l pid| grep 'java.lang.Thread.State'**发现项目的线程状态大多数都是WAITING(parking)状态

分析是线程一直处于等待状态一直在占用,造成GC无法执行,且新请求进来时造成线程占用累计

3.打印当前JVM快照:

**jstack 7 > /opt/test.dump**

查看快照定位原因:

分析原因

在我的业务中每次处理请求时都会创建一个线程池去多链路执行不同的流程,但是执行完毕后没有使用shutdown()关闭这个线程池对象

这样线程池仍会通过take方法去取等待队列中是否还有未完成的线程任务,等待队列为空时将会一直等待

这样就导致大量的线程hung在这里了(基本是只要方法被调一次,就会产生一个hung住的线程),所以有大量空线程一直占用,造成严重的线程泄漏

总结

在自定义线程池且未交给spring容器管理时,使用完毕的线程池一定要执行shutDown()手动关闭线程池,这是编程上的疏忽。

找到原因后感觉问题很简单,但是查找过程中还是碰壁不少,找过几次都没有找到最终原因。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 深入解析面向对象编程在Java中的应用小结

    深入解析面向对象编程在Java中的应用小结

    本文详细介绍了面向对象编程的基本概念,包括类和对象、封装、继承和多态,通过具体的Java代码示例,展示了如何在Java中应用这些面向对象编程的核心思想,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • java中hashCode方法与equals方法的用法总结

    java中hashCode方法与equals方法的用法总结

    总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复
    2013-10-10
  • 浅谈redis key值内存消耗以及性能影响

    浅谈redis key值内存消耗以及性能影响

    这篇文章主要介绍了浅谈redis key值内存消耗以及性能影响,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java实现系统捕获异常发送邮件案例

    java实现系统捕获异常发送邮件案例

    这篇文章主要为大家详细介绍了java实现系统捕获异常发送邮件案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • JAVA中的OutputStreamWriter流解析

    JAVA中的OutputStreamWriter流解析

    这篇文章主要介绍了JAVA中的OutputStreamWriter流解析,OutputStreamWriter提供了一种方便的方式将字符数据写入到输出流中,并进行字符编码转换,它是Java中处理字符流和字节流之间转换的重要工具之一,需要的朋友可以参考下
    2023-10-10
  • java中压缩文件并下载的实例详解

    java中压缩文件并下载的实例详解

    在本篇内容里小编给大家整理的是一篇关于java中压缩文件并下载的实例详解内容,有兴趣的朋友们可以学习下。
    2021-02-02
  • 使用maven命令安装jar包到本地仓库的方法步骤

    使用maven命令安装jar包到本地仓库的方法步骤

    这篇文章主要介绍了使用maven命令安装jar包到本地仓库的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 解决tk.mybatis中写自定义的mapper的问题

    解决tk.mybatis中写自定义的mapper的问题

    这篇文章主要介绍了使用tk.mybatis中写自定义的mapper的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 解决Java中new BigDecimal()的坑

    解决Java中new BigDecimal()的坑

    这篇文章主要介绍了解决Java中new BigDecimal()的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 教你如何用Java简单爬取WebMagic

    教你如何用Java简单爬取WebMagic

    今天给大家带来的是关于Java爬虫的相关知识,文章围绕着Java如何爬取WebMagic展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论