У вас не только утечка памяти, но и возможная утечка безопасности. Проблема в том, что для каждого запроса вы добавляете заголовки в список TTS_REQUEST_HEADERS
. Это означает, что с каждым запросом список увеличивается, и он никогда не сжимается.
Кроме того, вы используете 'шаблон двойной инициализации' , но в данном случае это не ' Это большая проблема.
Еще хуже, это означает, что фактический запрос может повторять определенные заголовки несколько раз (это зависит от того, что делает HTTP-клиент с повторными заголовками), что может непреднамеренно привести к утечке информации о предыдущих запросах. .
Решение этой проблемы состоит в том, чтобы скопировать список, добавить к копии заголовки вашего запроса, указав c, и использовать копию для выполнения запроса. Чтобы убедиться, что вы непреднамеренно не изменили список в константе, убедитесь, что он не является изменяемым (таким образом, он фактически является константой).
Для этого определите список как неизменяемый список, для пример:
public static final List<Header> TTS_REQUEST_HEADERS =
Collections.unmodifiableList(Arrays.asList(
new BasicHeader("Content-Type", "application/ssml+xml"),
new BasicHeader("X-Microsoft-OutputFormat", "xxx"),
new BasicHeader("X-Search-AppId", "xxx"),
new BasicHeader("X-Search-ClientID", "xxx"),
new BasicHeader("User-Agent", "xxx"),
new BasicHeader("Accept", "*/*")));
Или, для Java 9 и выше, используя List.of
:
public static final List<Header> TTS_REQUEST_HEADERS = List.of(
new BasicHeader("Content-Type", "application/ssml+xml"),
new BasicHeader("X-Microsoft-OutputFormat", "xxx"),
new BasicHeader("X-Search-AppId", "xxx"),
new BasicHeader("X-Search-ClientID", "xxx"),
new BasicHeader("User-Agent", "xxx"),
new BasicHeader("Accept", "*/*"));
Ваш код запроса станет:
// Copy the standard list of headers for this request
List<Header> headers = new ArrayList<>(MicrosoftConstant.TTS_REQUEST_HEADERS);
headers.add(new BasicHeader("Ocp-Apim-Subscription-Key", microsoftConfig.getAppKey()));
headers.add(new BasicHeader("Authorization", "Bearer " + authToken));
InputStream audioStream = null;
HttpEntity httpEntity = httpApiService.doPost(microsoftConfig.getTtsUrl(), body.getBytes(), headers);