OkHttpClient調優案例


作者:Grey

原文地址:OkHttpClient調優案例

實際案例
系統運行一段時間后,線程數量飆升,CPU持續居高不下

排查工具
https://fastthread.io/

這個工具是在線的,可以將dump日志文件上傳上去后直接生成分析報告,並且可以導出為PDF
以下是我導出的分析結果

值得關注的指標:

2

pool和OkHttp ConnectionPool占了前兩位,由於很多同事開發的時候,沒有定義有意義的線程名稱,所以pool這2031個線程不好排查,

我們就從OkHttp ConnectionPool這里的線程數入手,很顯然,這里是Okhttp的使用問題,

所以,我們排查了一下系統中所有使用Okhttp的地方,發現所有OkhttpClient的用法都是這樣用的:

3

因為我們有好多的服務,每個服務都可能會用OkhttpClient,所以圖中的getHttpClient()方法遍布各地,這個方法有什么問題呢?

我們進到了OkttpClient的源碼中,看到了這個構造方法,找到了原因:

3

這個構造方法中,每次拿一個OkhttpClient客戶端,

就要new一個ConnectionPool,

類似與每次new一個Thread就要new 一個ThreadPool一樣,

而ConnectionPool完全是可以復用的,所以不需要new ConnectionPool,復用即可,

所以我們把OkhttpClient的獲取邏輯修改成了以下:
3

即每個OkhttpClient復用一個ConnectionPool,
為了驗證,我特意在IDEA里面寫了兩個小程序來實驗一下:

3
3

源碼:

OkHttpClientNotSharePool

OkHttpClientSharePool


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM