与java.net.HttpClient处于状态CLOSE_WAIT的连接泄漏 - java

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

此处已经有一些问题(例如this one),但是应该将所有已提交的错误修复并反向移植到Java 11.0.6。

我已经能够将错误复制到极简主义者项目on github中。看来只有当客户端从服务器收到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());
      System.out.println(String.format("Response HTTP status: %s", response.statusCode()));
    }
    System.out.println("Finish");
    System.in.read();
  }
}

如果我们运行它:

App is running... pid: 23306
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Response HTTP status: 204
Finish
ss -np | grep 23306
u_str            ESTAB                  0                   0                                                                                                 * 4121660                                                        * 0               users:(("java",pid=23306,fd=13))                                               
u_str            ESTAB                  0                   0                                                                                                 * 4121047                                                        * 0               users:(("java",pid=23306,fd=6))                                                
tcp              ESTAB                  0                   0                                                                                [::ffff:127.0.0.1]:56666                                         [::ffff:127.0.0.1]:40177           users:(("java",pid=23306,fd=7))                                                
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58592                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=24))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58570                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=18))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58572                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=19))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58564                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=15))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58560                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=14))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58574                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=20))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58582                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=21))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58590                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=23))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58594                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=25))                                               
tcp              CLOSE-WAIT             1                   0                                                                                [::ffff:127.0.0.1]:58584                                         [::ffff:127.0.0.1]:4001            users:(("java",pid=23306,fd=22))                                               

OpenJDK错误(已修复):

  • https://bugs.openjdk.java.net/browse/JDK-8221395
  • https://bugs.openjdk.java.net/browse/JDK-8236596
  • 参考方案

    这可能是https://bugs.openjdk.java.net/browse/JDK-8216974,已在JDK 13中修复

    Java-搜索字符串数组中的字符串 - java

    在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

    您知道处理网络白板的框架吗? - java

    我正在寻找一个提供白板标准管理的框架。例如,一个区域,网络用户可以使用鼠标在该区域上绘制一些内容,并在发布表单时将其保存到服务器(例如)。 (Php,Java,.net吗?) 参考方案 http://cristian.nexcess.net/ajax/whiteboard/

    java.net.URI.create异常 - java

    java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…

    从JAVA调用方法C#.NET - java

    我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

    java.net.UnknownHostException无法连接到ftp - java

    我的ftp端口为:ftp://173.201.0.1/我正在尝试通过以下方式将其连接:String Ftp_Path = "ftp://173.201.0.1/"; public List<String> GetFileList() { String ftpServerIP = Ftp_Path; String ftpUser…