Я только начинаю писать простой веб-сканер, чтобы получить информацию о ссылках, которые мы получаем в нашей системе.Я использую httpclient 4.x.У меня около 100 потоков, запускающих извлечение ссылок и выполняющих запросы на них, они отлично работают в течение первых нескольких часов, а затем замедляются до визгливого сканирования.Я не уверен, правильно ли я настраиваю диспетчер соединений.
Вот код, который мне нужен для создания объекта httpclient.Кто-нибудь видел что-нибудь, что вызвало бы тревогу с этим блоком кода?Когда я останавливаю сервер и перезагружаю его, все становится снова как новый.Во время фазы, когда она работает медленно, память все еще выглядит нормально с постоянной скоростью 500 Кбайт на процесс, так что не похоже, что я теряю память.
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, 5000);
ConnManagerParams.setMaxTotalConnections(httpParams, 200);
HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
// set request params
httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
httpParams.setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 443));
final ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParams,schemeRegistry);
HttpClient httpClient = new DefaultHttpClient(cm, httpParams);
httpClient.getParams().setParameter("http.conn-manager.timeout", 10000L);
httpClient.getParams().setParameter("http.protocol.wait-for-continue", 10000L);
Я также использую этот код в потокечтобы очистить соединения с истекшим сроком, как указано в документации
final Runnable cleanUp = new Runnable() {
public void run() {
cm.closeExpiredConnections();
// Optionally, close connections
// that have been idle longer than 30 sec
cm.closeIdleConnections(30, TimeUnit.SECONDS);
}
};
ОБНОВЛЕНИЕ: я запускал визуальную ВМ в течение часа или около того, и вот график памяти для удаленного процесса, память теперь используется
http://img64.imageshack.us/f/screenshot20100714at204.png/