本人做了一個基于java的網路轉發系統。需求是這樣的,A系統是在內網(局域網),B系統是在外網(互聯網)現在A系統需要呼叫B系統的介面。由于安全性的問題,網路只能開通互通,卻不能直接使用網路代理。這樣會造成一個很大的風險隱患。
所以,只能開發一個前置系統,A系統的請求發送至前置系統,再經由前置系統,向B系統發起請求,并把回應結果回傳給A系統。這樣做的目的是讓兩個系統的網路能互通,并僅限于配置的URL地址,不是全網路代理,減少風險。
現在這個前置系統,我采用的是okHttp3這個網路框架進行發起http請求。在做性能測驗時,發送,okhttp3每一次請求,都會創建一個執行緒。執行緒在閑60秒后,會自動回收,問題出現在這里,高并發下,新增的執行緒數大于回收的執行緒數,這樣造成了記憶體溢位,資源不夠。
看了下okhttp的框架原始碼后,發現,它有一個ConnectionPool類,里面有一個靜態的初始化執行緒池的代碼。
static {
executor = new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue(), Util.threadFactory("OkHttp ConnectionPool", true));
}
從這里可以看到,它最大的執行緒數是2147483647,空閑時間是60秒就回收。原先,這個框架的使用物件是安卓系統,因為用戶不可能高并發的去點一個按鈕,這樣做或者沒有問題,不會產生多少執行緒數,且一分鐘后就會回收。但是,我使用在java web系統中。請求轉發高并發時達幾千的TPS,此時就出現了記憶體溢位問題。查看了執行緒數,高達2000多個。
我不確定是否我的使用方式有問題。特來請求CSDN的大神們,有什么解決的渠道或者是否使用的引數設定問題導致的。萬分感謝

uj5u.com熱心網友回復:
我也想知道 解決了嗎轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/269455.html
標籤:Web 開發
上一篇:學習JVM相關書籍
