跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Java 线程数过高,如何排查
未分類
31 12 月 2020

Java 线程数过高,如何排查

Java 线程数过高,如何排查

資深大佬 : hello826 3

最近在生产环境遇到个问题,一个 java web 服务的监控到线程数达到 4000 多左右,而且一直在上涨。

通过 jstack 查看线程情况,发现状态都是 TIMED_WAITING,

但是看堆栈信息只能看到很少的信息,无法定位到是哪个地方导致的,调用信息如下图,我怀疑是项目用到了

httpClient 导致的(版本 4.3 ),但是没有证据。。。请问下各位有什么好的方法能定位到具体是哪块调用的方法导

致的。

jstack 分析结果如下,堆栈信息很简单,4000 多个都是和这个一样的情况 Java 线程数过高,如何排查

大佬有話說 (14)

  • 資深大佬 : BBCCBB

    首先代码里生成 thread 的地方一定要指定 name/threadFactory, 不然不好排查..

  • 資深大佬 : chendy

    这个线程名是手 new Thread 的线程名
    找到 new Thread 的地方,修改成使用线程池的形式
    代码里搜 new Thread( 基本就能找到了……

  • 資深大佬 : leafre

    写业务时没命名好线程的结果

  • 資深大佬 : cheng6563

    大概率是监控程序起了个线程想异步推送数据,但没有设置超时时间,目标端口能握手但不响应(多半是安全组或防火墙没开),就出现这样的情况了。
    你看看能不能配置下响应超时时间,也可以排除下那个监控服务端的连接问题。

  • 資深大佬 : Jooooooooo

    ali 的 Java 开发规范大部分内容遵守都是不错的

    比如这个, 线程名称要自定义

  • 資深大佬 : securityCoding

    直接搜业务代码 Thread 关键字

  • 資深大佬 : sonice

    Unirest 没 shutdown

  • 資深大佬 : ChovyChu

    看一下栈不就知道这个线程是干嘛的吗,一下就能找到在哪创建的了吧

  • 資深大佬 : lsongiu

    客户端大量关闭 tcp 链接,time_wait 过多?短连接改长连接试试?不行来个 http 连接池

  • 資深大佬 : berg223

    原因是你 new 的 unirest 实例太多了,具体参见:
    https://stackoverflow.com/questions/59309046/unirest-thread-leak

  • 資深大佬 : berg223

    其实堆栈信息已经很明确了,就是卡在了 SyncIdleConnectionMonitorThread 这个文件的 22 行,你看一下代码差不多能猜到原因了

  • 資深大佬 : berg223

    具体的讨论可以看一下: https://github.com/Kong/unirest-java/issues/140

  • 主 資深大佬 : hello826

    @berg223 果然是这个,我还以为是 jdk 的方法,没想到这个是二方的包

  • 主 資深大佬 : hello826

    问题解决了,不是 httpClient 的锅,是二方包的 bug,文件服务上传每次前端有请求,后端都会创建一个线程,而且是永不关闭的线程。。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具