问题描述:
系统晚上七点升级后,第二天系统使用时,线程数告警,如下图:
排查过程:
接收到运维反馈后,做了下几个步骤的工作:
- 首先判断一下对系统使用人员是否造成了实质性的影响。通过自行登录及使用收集,线程数1W左右时,对系统并未造成实质影响。
- 查看昨天升级内容,缩小排查范围,同时让运维通过jstack命令获取了dump快照信息 , dump信息如下:
最终,通过dump信息及升级内容,很快定位到问题所在, 问题代码如下:
/**
* get方式请求
* @param url
* @return 服务器返回值
* @throws IOException
*/
public static Response get(String url) throws IOException {
Request request = new Request.Builder().url(url)
.build();
Response response = new OkHttpClient().newCall(request).execute();
if (!response.isSuccessful())
throw new IOException("请求有错:" + response);
return response;
}
每次调用get方法时,都new一个对象OkHttpClient()即每次请求都会创建一个线程池,大量并重复访问导致活动线程数不断增高。
解决方案:
使用OkHttpClient的单例模式,复用线程池。