今天一上班,又出现too many open files的异常,lsof了一下,发现tomcat打开8000多连接,大多都是Close_wait状态。检查代码,发现是httpclient太多了。
从名字上看,一个httpclient代表一个客户端。我们写代码一般是这样:
HttpClient hc=new HttpClient();
GetMethod get=new GetMethod(url);
try{
hc.executeMethod(get);
}catch(Exception e){
}finally{
get.releaseConnection();
}
get的连接是显式释放的,但是HttpClient对象只能等这个方法的生命周期完了系统在某个时候释放。
而我在代码里不小心写了一个方法,每次连接都new 了一个HttpClient对象,从而导致too many files的异常。
所以最好把HttpClient作为一个参数,反复重用它。