Мне нужно использовать HttpAsyncClient при высокой нагрузке. Я создаю HttpAsyncClient следующим образом:
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(CONNECT_TIMEOUT)
.setSocketTimeout(SOCKET_TIMEOUT)
.setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT)
.build();
HttpAsyncClient client = HttpAsyncClients.custom()
.setDefaultRequestConfig(createRequestConfig())
.build();
И тогда я использую это так:
HttpPost request = new HttpPost(url);
request.setEntity(new StringEntity(requestBody, "UTF-8"));
client.execute(request, null)
Обычно меня не волнует ответ, поэтому я не инициализирую переменную Future<HttpResponse>
и не делаю Future.get()
. Ну, просто для уточнения (я не думаю, что это как-то связано с вопросом), мне иногда интересны ответы, но 99% ответов мне не интересны.
Проблема в том, что когда я делаю много запросов (например, 300 в секунду, и под словом «запрос» здесь я подразумеваю client.execute()
вызов), я, наконец, получаю java.lang.OutOfMemoryError: GC overhead limit exceeded
. Я попытался использовать VisualVM, чтобы узнать, что происходит. Я вижу, что количество экземпляров java.lang.Object[]
, char[]
, java.lang.String
, byte[]
, short
, char[]
экземпляров растет (я пытался принудительно собрать сборщик мусора и ограничить размер кучи, чтобы убедиться, что это ненормально - не помогло). И поэтому растет используемое пространство кучи.
Что вызывает эту проблему? Может быть, мне следует использовать HttpAsyncClient
как-то по-другому? Нужно ли использовать пользовательские RequestProducer
, ResponseProducer
или использовать CountDownLatch
?
UPD Проблема возникла из-за библиотеки PowerMock
HttpAsyncClient
экземпляров у вас есть? - person Andremoniy   schedule 15.01.2016client
для каждого запроса или нет? - person Andremoniy   schedule 15.01.2016client
- person coolguy   schedule 15.01.2016