Будет ли утечка памяти, если Asynchttpclient не закрыт? - PullRequest
1 голос
/ 02 ноября 2019

Мы используем AsynHttpClient в нашем приложении. У нас есть сценарий использования, когда мы должны делать огромное количество запросов на запуск и забытие, так как при этом используется NIo, мы подумали, что это хороший подход.

Клиент AHC , как упомянуто в документации, предлагаетон разделяет жизненный цикл как приложение («экземпляры AsyncHttpClient предназначены для глобальных ресурсов, которые используют тот же жизненный цикл, что и приложение»).

Итак, я инициализировал клиент AHC один раз и продолжал его использовать.

Обзор функциональности:

public class Client{

  private static AsyncHttpClientConfig asyncHttpClientConfig = new AsyncHttpClientConfig().Builder().setRequestTimeout(someMs).setMaxRetryCount()

  private static AsyncHttpClient asyncHttpClient = AsyncHTTPClientFactory.getAsyncHttpClient(asyncHttpClientConfig)

  public static AsyncHttpClient getClient(){
    return asyncHttpClient;
  }
}

public class Usageclass{

  // some code 
  AsyncHttpClient asyncHttpClient = Client.getClient();
  Future response = asyncHttpClient.setRootEndpoint(url).setBody(body).execute();
}


Мы сможем отслеживать память JVM, доступную через панель мониторинга, предоставленную другой командой. Я вижу, что память JVM, доступная в приложении, уменьшается при поступлении запросов, как только включается GC (сборщик мусора), я вижу, что память не полностью освобождена. Каждый раз, когда выполняется сборка мусора, доступная память JVM уменьшается по сравнению с предыдущими запусками.

Я хотел бы знать, потому что мы не закрываем соединение AHC? Если да, то какой будет правильный подход?

...