1 CLOSE_WAIT 等待資源釋放
對應socket中,客戶端就是等待inputStream關閉,服務端就是等待outputStream關閉。 可以通過 netstate 指令獲取連接情況。
# netstat -t | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 27
ESTABLISHED 28
TIME_WAIT 4865
2 leased 連接池中正在使用的連接數
leased 連接池中正在使用的連接數
available 連接池中可用的連接數
(leased + available)爲創建的總連接數
pending 存放等待獲取連接的線程的Future
PoolingHttpClientConnectionManager.getTotalStats().toString()
[leased: 23; pending: 0; available: 2; max: 200]
3 問題
程序運行一段時間,TCP等待釋放資源的連接數和httpclient中正在使用的連接數不下降,且數目接近。
4 原因
httpclient未進行資源的釋放。
5 解決
使用 EntityUtils.consume( entity ); 即可釋放資源。
6 分析
EntityUtils.consume( entity ); 源碼:
public static void consume(HttpEntity entity) throws IOException {
if(entity != null) {
if(entity.isStreaming()) {
InputStream instream = entity.getContent();
if(instream != null) {
instream.close();
}
}
}
}
通過關閉InputStream,釋放TCP資源,同時等待HttpClient中的回收線程對連接進行回收(未標記重用的連接直接關閉)