我正在写一个与Okhttp连接泄漏相关的issue。泄漏堆栈跟踪似乎指向在PodOperationsImpl#L267中打开的这个WebSocket连接:
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。克隆客户端容易发生连接泄漏吗?或者我做得不对?有没有办法确保我们可以处理这些连接泄漏警告消息?
还有一件事,websocket是使用已经实现了AutoCloseable的ExecWebSocketListener打开的。尽管从调用者那里尝试使用资源似乎可以避免这些警告。但我不确定它是否真的修复了泄漏的根本原因。
发布于 2018-07-02 19:08:43
克隆是不相关的。此警告依赖于垃圾回收器来查找在关闭之前超出范围的实例,并且此过程既不是即时的,也不是特别可靠的。
https://stackoverflow.com/questions/51130818
复制相似问题