gpt4 book ai didi

java - 关闭 Java HTTP 客户端

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:05 24 4
gpt4 key购买 nike

有没有办法关闭 java.net.http.HttpClient 以立即释放它持有的资源?

它在内部包含一个选择器、一个连接池和一个Executor(当使用默认执行器时)。但是它没有实现 Closeable/AutoCloseable

最佳答案

当我将 war 文件重新部署到 Tomcat 时,我遇到了类似的问题。 War 应用程序有一个 HttpClient,它正在运行发出 http 请求和处理结果的预定作业。

我经常在开发环境中重新部署 war 文件时看到来自 Tomcat 的警告,关于可能导致内存泄漏的挂起线程。堆栈跟踪指向 HttpClient 线程。经过几次尝试,我以这种方式解决了这个问题:

  1. HttpClient 仅在需要执行作业时创建。它不是作为类或服务的字段创建的,只是作为计划方法内的局部变量创建的。

  2. HttpClient 是使用构建器创建的,并填充了 ThreadPool Executor,因此我保留了到 Executor 的链接并对其进行了控制。
    ExecutorService executor = Executors.newSingleThreadExecutor();
    HttpClient 客户端 = HttpClient.newBuilder().followRedirects(Redirect.ALWAYS).connectTimeout(Duration.ofSeconds(5)).executor(executor).build();

  3. 当作业在 try-catch block 中完成时,finally 部分有以下两行:显式关闭线程池并将 null 设置为 httpClient 局部变量:
    执行器.shutdownNow();
    客户=空;
    系统.gc();

注意,有短连接超时来限制执行时间。保持线程数小。我使用 1 个线程的线程池。

在所有这些更改之后,有关内存泄漏的警告从 Tomcat 日志中消失了。

关于java - 关闭 Java HTTP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53919721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com