作者:Grey
原文地址:OkHttpClient調優案例
實際案例
系統運行一段時間后,線程數量飆升,CPU持續居高不下
這個工具是在線的,可以將dump日志文件上傳上去后直接生成分析報告,並且可以導出為PDF
以下是我導出的分析結果
值得關注的指標:
pool和OkHttp ConnectionPool占了前兩位,由於很多同事開發的時候,沒有定義有意義的線程名稱,所以pool這2031個線程不好排查,
我們就從OkHttp ConnectionPool這里的線程數入手,很顯然,這里是Okhttp的使用問題,
所以,我們排查了一下系統中所有使用Okhttp的地方,發現所有OkhttpClient的用法都是這樣用的:
因為我們有好多的服務,每個服務都可能會用OkhttpClient,所以圖中的getHttpClient()方法遍布各地,這個方法有什么問題呢?
我們進到了OkttpClient的源碼中,看到了這個構造方法,找到了原因:
這個構造方法中,每次拿一個OkhttpClient客戶端,
就要new一個ConnectionPool,
類似與每次new一個Thread就要new 一個ThreadPool一樣,
而ConnectionPool完全是可以復用的,所以不需要new ConnectionPool,復用即可,
所以我們把OkhttpClient的獲取邏輯修改成了以下:
即每個OkhttpClient復用一個ConnectionPool,
為了驗證,我特意在IDEA里面寫了兩個小程序來實驗一下:
源碼: