Я работаю над проблемой , связанной с утечками соединения Okhttp. Трассировка стека утечки указывает на то, что это соединение WebSocket открывается в PodOperationsImpl # L267:
try {
URL url = new URL(URLUtils.join(getResourceUrl().toString(), sb.toString()));
Request.Builder r = new Request.Builder().url(url).header("Sec-WebSocket-Protocol", "v4.channel.k8s.io").get();
OkHttpClient clone = client.newBuilder().readTimeout(0, TimeUnit.MILLISECONDS).build();
final ExecWebSocketListener execWebSocketListener = new ExecWebSocketListener(getConfig(), in, out, err, errChannel, inPipe, outPipe, errPipe, errChannelPipe, execListener);
clone.newWebSocket(r.build(), execWebSocketListener);
execWebSocketListener.waitUntilReady();
return execWebSocketListener;
} catch (Throwable t) {
throw KubernetesClientException.launderThrowable(forOperationType("exec"), t);
}
Когда я запускаю тест, представленный в самой проблеме, я вижу сообщения об утечке соединения в журналах:
WARNING: A connection to http://localhost:48271/ was leaked. Did you forget to close a response body?
java.lang.Throwable: response.body().close()
Но когда я создаю OkHttpClient из нового экземпляра, а не клонирую его из предыдущего, эти предупреждения об утечке соединения уменьшаются на 3/4. Является ли клиент клонирования склонным к утечкам соединения? Или я не правильно делаю? Есть ли способ убедиться, что мы можем обработать эти предупреждающие сообщения об утечке соединения?
Еще одна вещь, веб-сокет открывается с помощью ExecWebSocketListener , который уже реализует AutoCloseable
. Хотя выполнение try-with-resources от вызывающей стороны, похоже, избегает этих предупреждений. Но я не уверен, исправляет ли это основную причину утечек.