首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >克隆客户端导致的OkHttp连接泄漏

克隆客户端导致的OkHttp连接泄漏
EN

Stack Overflow用户
提问于 2018-07-02 15:12:19
回答 1查看 300关注 0票数 2

我正在写一个与Okhttp连接泄漏相关的issue。泄漏堆栈跟踪似乎指向在PodOperationsImpl#L267中打开的这个WebSocket连接:

代码语言:javascript
复制
        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);
        }

当我运行问题本身提供的测试时,我在日志中看到连接泄漏消息:

代码语言:javascript
复制
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。克隆客户端容易发生连接泄漏吗?或者我做得不对?有没有办法确保我们可以处理这些连接泄漏警告消息?

还有一件事,websocket是使用已经实现了AutoCloseableExecWebSocketListener打开的。尽管从调用者那里尝试使用资源似乎可以避免这些警告。但我不确定它是否真的修复了泄漏的根本原因。

EN

回答 1

Stack Overflow用户

发布于 2018-07-02 19:08:43

克隆是不相关的。此警告依赖于垃圾回收器来查找在关闭之前超出范围的实例,并且此过程既不是即时的,也不是特别可靠的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51130818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档