httpcore-nio引起的線程、fd泄露問題

依賴來源:httpasyncclient-4.1.4.jar

現象

程序報錯too many open files
線程數飆升、句柄數飆升
thread dump顯示大量

"I/O dispatcher 7215" #9102 prio=5 os_prio=0 tid=0x00002b7ba036a800 nid=0x6f24 runnable [0x00002b7d98d41000]java.lang.Thread.State: RUNNABLEat sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)- locked <0x0000000778c3e978> (a sun.nio.ch.Util$3)- locked <0x0000000778c3e968> (a java.util.Collections$UnmodifiableSet)- locked <0x0000000778c3e850> (a sun.nio.ch.EPollSelectorImpl)at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:255)at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)at java.lang.Thread.run(Thread.java:748)

原因

RestHighLevelClient底層依賴的是CloseableHttpAsyncClient的實現類CloseableHttpAsyncClientBase

abstract class CloseableHttpAsyncClientBase extends CloseableHttpPipeliningClient {private final NHttpClientConnectionManager connmgr;private final Thread reactorThread;public CloseableHttpAsyncClientBase(final NHttpClientConnectionManager connmgr,final ThreadFactory threadFactory,final NHttpClientEventHandler handler) {super();this.connmgr = connmgr;if (threadFactory != null && handler != null) {this.reactorThread = threadFactory.newThread(new Runnable() {@Overridepublic void run() {try {final IOEventDispatch ioEventDispatch = new InternalIODispatch(handler);connmgr.execute(ioEventDispatch);} catch (final Exception ex) {log.error("I/O reactor terminated abnormally", ex);} finally {status.set(Status.STOPPED);}}});} else {this.reactorThread = null;}this.status = new AtomicReference<Status>(Status.INACTIVE);}@Overridepublic void start() {if (this.status.compareAndSet(Status.INACTIVE, Status.ACTIVE)) {if (this.reactorThread != null) {this.reactorThread.start();}}}@Overridepublic void close() {if (this.status.compareAndSet(Status.ACTIVE, Status.STOPPED)) {if (this.reactorThread != null) {try {this.connmgr.shutdown();} catch (final IOException ex) {this.log.error("I/O error shutting down connection manager", ex);}try {this.reactorThread.join();} catch (final InterruptedException ex) {Thread.currentThread().interrupt();}}}}
}

可以看到調用close時主要是兩個操作,調用NHttpClientConnectionManager的shutdown方法并阻塞等待reactorThread結束。reatorThread的run方法中調用了AbstractMultiworkerIOReactor 的execute方法,這個方法由于status值沒有改變過,實際上是個死循環。因此該線程一直無法結束。

public abstract class AbstractMultiworkerIOReactor implements IOReactor {@Overridepublic void execute(try {for (;;) {if (this.status.compareTo(IOReactorStatus.ACTIVE) == 0) {processEvents(readyCount);}// Verify I/O dispatchersfor (int i = 0; i < this.workerCount; i++) {final Worker worker = this.workers[i];final Throwable ex = worker.getThrowable();if (ex != null) {throw new IOReactorException("I/O dispatch worker terminated abnormally", ex);}}if (this.status.compareTo(IOReactorStatus.ACTIVE) > 0) {break;}}} catch (final ClosedSelectorException ex) {addExceptionEvent(ex);} catch (final IOReactorException ex) {if (ex.getCause() != null) {addExceptionEvent(ex.getCause());}throw ex;} finally {doShutdown();synchronized (this.statusLock) {this.status = IOReactorStatus.SHUT_DOWN;this.statusLock.notifyAll();}}}```

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87364.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87364.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多線程生產者消費者模型實戰案例

多線程生產者消費者模型實戰案例 前言業務場景術前準備無鎖無事務有事務 synchronized事務在鎖外事務在鎖內 數據庫行鎖什么是數據庫行鎖有事務沒有事務 樂觀鎖ReentrantLock分布式鎖 前言 曾經一直有一個疑惑&#xff0c;就是關于多線程生產者消費者模型的學習過程中&#xf…

青少年編程與數學 02-022 專業應用軟件簡介 03 三維建模及動畫軟件:Autodesk Maya

青少年編程與數學 02-022 專業應用軟件簡介 03 三維建模及動畫軟件&#xff1a;Autodesk Maya 一、什么是三維建模二、什么是計算機動畫三、三維建模及動畫設計軟件的發展歷程&#xff08;一&#xff09;早期探索階段&#xff08;20世紀60年代 - 80年代&#xff09;&#xff08…

獲得 OCM 大師證書學習歷練

當我站在山城重慶的洪崖洞前&#xff0c;看著璀璨的夜景倒映在嘉陵江上&#xff0c;手中緊握著 OCM 大師證書&#xff0c;那一刻&#xff0c;備考時的艱辛與考試時的緊張都化作了滿滿的成就感。這段在重慶獲得 OCM 大師證書的經歷&#xff0c;就像一場充滿挑戰與驚喜的冒險&…

srs-gb28181 與 SRS 5.0 對 GB28181 國標支持

srs-gb28181 是基于 SRS 4.0/5.0 的國標&#xff08;GB28181&#xff09;擴展分支&#xff0c;而 SRS 5.0 官方版本也逐步增強了對 GB28181 的支持。以下是兩者的主要區別&#xff1a; 1. 功能支持對比 功能srs-gb28181&#xff08;擴展分支&#xff09;SRS 5.0&#xff08;官…

算法第18天|繼續二叉樹:修剪二叉搜索樹、將有序數組轉化為二叉搜索樹、把二叉搜索樹轉換為累加樹

今日總結&#xff1a; 1、修剪二叉搜索樹&#xff08;重點思考如何修剪&#xff09; &#xff08;1&#xff09;遞歸的返回值是什么&#xff1f;&#xff08;與插入、刪除一樣&#xff09; &#xff08;2&#xff09;遞歸的單層邏輯一定要縷清&#xff08;3中情況討論&#xff…

C# 多線程(三)線程池

目錄 1.通過TPL使用線程池 2.不使用TPL進入線程池的辦法 異步委托 3.線程池優化技術 最小線程數的工作原理 每當啟動一個新線程時&#xff0c;系統都需要花費數百微秒來分配資源&#xff0c;例如創建獨立的局部變量棧空間。默認情況下&#xff0c;每個線程還會占用約1…

學習筆記(29):訓練集與測試集劃分詳解:train_test_split 函數深度解析

學習筆記(29):訓練集與測試集劃分詳解&#xff1a;train_test_split 函數深度解析 一、為什么需要劃分訓練集和測試集&#xff1f; 在機器學習中&#xff0c;模型需要經歷兩個核心階段&#xff1a; 訓練階段&#xff1a;用訓練集數據學習特征與目標值的映射關系&#xff08;…

【全網唯一】自動化編輯器 Windows版純本地離線文字識別插件

目的 自動化編輯器超輕量級RPA工具&#xff0c;零代碼制作RPA自動化任務&#xff0c;解放雙手&#xff0c;釋放雙眼&#xff0c;輕松玩游戲&#xff0c;刷任務。本篇文章主要講解下自動化編輯器的TomatoOCR純本地離線文字識別Windows版插件如何使用和集成。 準備工作 1、下載自…

GitHub 2FA綁定

GitHub 2FA綁定 作為全球最大的代碼托管平臺&#xff0c;GitHub對賬號安全的重視程度不斷提升——自2023年3月起&#xff0c;GitHub已要求所有在GitHub.com上貢獻代碼的用戶必須啟用雙因素身份驗證&#xff08;2FA&#xff09;。如果你是符合條件的用戶&#xff0c;會收到一封…

pytest fixture基礎大全詳解

一、介紹 作用 fixture主要有兩個作用&#xff1a; 復用測試數據和環境&#xff0c;可以減少重復的代碼&#xff1b;可以在測試用例運行前和運行后設置和清理資源&#xff0c;避免對測試結果產生影響&#xff0c;同時也可以提高測試用例的運行效率。 優勢 pytest框架的fix…

Unity知識點-Renderer常用材質變量

本篇總結了Unity中renderer的3種常用的材質相關的變量&#xff1a;renderer.material,renderer.sharedMaterial,renderer.MaterialPropertyBlock。以及三者對SRPBatcher的影響。 一.介紹及對比 1.概念介紹 1.material 定義&#xff1a;material 是Render組件&#xff08;如…

【算法】??如何判斷時間復雜度?

文章目錄 1. 什么是時間復雜度&#xff1f;為什么需要時間復雜度&#xff1f; 2. 常見時間復雜度對比3. 如何分析時間復雜度&#xff1f;&#xff08;Java版&#xff09;&#x1f539; 步驟1&#xff1a;找出基本操作&#x1f539; 步驟2&#xff1a;分析循環結構&#xff08;1…

MySQL使用C語言連接

文章目錄 版本查看以及編譯mysql接口介紹初始化鏈接數據庫下發mysql命令mysql_query獲取執行結果mysql_store_result獲取結果行數mysql_num_rows獲取結果列數mysql_num_fields獲取列名mysql_fetch_fields獲取結果內容mysql_fetch_row關閉mysql鏈接mysql_closeC語言操作mysql查看…

堅持每日Codeforces三題挑戰:Day 7 - 題目詳解(2025-06-11,難度:1200,1300,1500)

每天堅持寫三道題第七天&#xff1a; Problem - A - Codeforces 1200 Problem - B - Codeforces 1300 Problem - A - Codeforces 1500 目錄 題目一: 題目大意: 解題思路: 代碼(C): 題目二: 題目大意: 解題思路: 代碼(C): 題目三: 題目大意: 解題思路: 代碼(C): …

洛谷 P4305:[JLOI2011] 不重復數字 ← unordered_set

【題目來源】 https://www.luogu.com.cn/problem/P4305 【題目描述】 給定 n 個數&#xff0c;要求把其中重復的去掉&#xff0c;只保留第一次出現的數。 【輸入格式】 第一行一個整數 T&#xff0c;表示數據組數。 對于每組數據&#xff0c;第一行一個整數 n。第二行 n 個數…

STM32固件升級設計——SPIFLASH模擬U盤升級固件

目錄 概述 一、功能描述 1、BootLoader部分&#xff1a; 2、APP部分&#xff1a; 二、BootLoader程序制作 1、分區定義 2、 主函數 3、配置USB 4、配置fatfs文件系統 5、程序跳轉 三、APP程序制作 四、工程配置&#xff08;默認KEIL5&#xff09; 五、運行測試 六…

解鎖阿里云日志服務SLS:云時代的日志管理利器

引言&#xff1a;開啟日志管理新篇 在云計算時代&#xff0c;數據如同企業的血液&#xff0c;源源不斷地產生并流動。從用戶的每一次點擊&#xff0c;到系統后臺的每一個操作&#xff0c;數據都在記錄著企業運營的軌跡。而在這些海量的數據中&#xff0c;日志數據占據著至關重…

Keye-VL-8B-Preview:由快手 Kwai Keye 團隊精心打造的尖端多模態大語言模型

&#x1f525; News 2025.06.26 &#x1f31f; 我們非常自豪地推出Kwai Keye-VL&#xff0c;這是快手Kwai Keye團隊精心打造的前沿多模態大語言模型。作為快手先進技術生態中的核心AI產品&#xff0c;Keye在視頻理解、視覺感知和推理任務方面表現卓越&#xff0c;樹立了新的性…

Web前端之JavaScript實現圖片圓環、圓環元素根據角度指向圓心、translate、rotate

MENU 前言效果HtmlStyleJavaScript 前言 代碼段創建了一個由6個WiFi圖標組成的圓形排列&#xff0c;每個圖標均勻分布在圓周上。 效果 Html 代碼 <div class"ring"><div class"item"><img class"img" src"../image/icon/W…

1 Studying《Computer Vision: Algorithms and Applications 2nd Edition》11-15

目錄 Chapter 11 Structure from motion and SLAM 11.1 幾何內稟校準 11.2 姿態估計 11.3 從運動中獲得的雙幀結構 11.4 從運動中提取多幀結構 11.5 同步定位與建圖&#xff08;SLAM&#xff09; 11.6 額外閱讀 Chapter 12 Depth estimation 12.1 極點幾何 12.2 稀疏…