小编Gre*_*ire的帖子

java.net.HttpClient 状态为 CLOSE_WAIT 的连接泄漏

我们使用 openJDK11.0.6 java.net.http HTTP (HTTP1.1) 客户端从网站获取内容。经过长时间的执行,我们注意到性能下降。即使应用程序不执行任何操作,CPU 也会 100% 使用。我们能够确定它来自大量应用程序泄漏的套接字(CLOSE-WAIT 状态)。

这里已经有一些关于它的问题(比如这个),但是所有提交的错误都应该被修复并反向移植到 java 11.0.6。

我已经能够将该错误重现到github 上的一个 minalist 项目。似乎只有当客户端从服务器收到 204 NO-CONTENT 时才会发生这种情况。

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpClient.Version;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;

public class BasicFetcherApp {

  public static void main(String[] args) throws Exception {
    System.out.println("App is running... pid: " + ProcessHandle.current().pid());
    HttpClient client = HttpClient.newBuilder().version(Version.HTTP_1_1).build();
    for (int i = 0; i < 10; ++i) {
      HttpRequest request =
          HttpRequest.newBuilder(URI.create("http://localhost:4001/nocontent")).build();
      HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); …
Run Code Online (Sandbox Code Playgroud)

java connection-leaks java-http-client java-11

5
推荐指数
1
解决办法
754
查看次数