Утечка соединения OkHttp из-за клонированного клиента - PullRequest
0 голосов
/ 02 июля 2018

Я работаю над проблемой , связанной с утечками соединения 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 от вызывающей стороны, похоже, избегает этих предупреждений. Но я не уверен, исправляет ли это основную причину утечек.

1 Ответ

0 голосов
/ 02 июля 2018

Клон не связан. Это предупреждение полагается на сборщик мусора, который находит экземпляры, которые вышли из области действия до того, как они были закрыты, и этот процесс не является ни немедленным, ни особенно надежным.

...