- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 httpclients 4.5.4 时遇到问题。当我关闭与连接相关的所有内容时,java GC 无法收集 PoolingHttpClientConnectionManager 对象。当应用程序运行大约 1 个月时,我遇到了 OOM 异常。我的代码与 https://hc.apache.org/httpcomponents-client-4.5.x/httpclient/examples/org/apache/http/examples/client/ClientConnectionRelease.java 中的示例相同。并且InternalHttpClient对象也不能被java GC收集。下面是我的代码,是否有任何对象保存这两个类的引用?
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpUtil {
private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
/**
* Http post请求
*/
public static String doHttpPost(String postUrl, Map<String, String> headers,
Map<String,String> params,String filePath) {
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
HttpPost post = getHttpPost(postUrl, headers, params, filePath);
CloseableHttpResponse response = httpClient.execute(post);
try {
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try {
inputStream = response.getEntity().getContent();
inputStreamReader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(inputStreamReader);
return bufferedReader.readLine();
}catch (Exception e) {
logger.warn("do http post fail : ", e);
}finally {
if (bufferedReader != null) {
logger.info("release bufferedReader: " + filePath);
bufferedReader.close();
}
if (inputStreamReader != null) {
logger.info("release inputStreamReader: " +filePath);
inputStreamReader.close();
}
if (inputStream != null) {
logger.info("release inputStream: " +filePath);
inputStream.close();
}
}
}
} catch (Exception e) {
logger.warn("do http post fail: ", e);
} finally {
if (response != null) {
logger.info("release response: " + filePath);
response.close();
}
if (post != null) {
logger.info("release HttpPost: " + filePath);
post.releaseConnection();
}
}
} catch (Exception e) {
logger.warn("do http post fail: ", e);
} finally {
if (httpClient != null) {
logger.info("release httpClient: " + filePath);
httpClient.close();
logger.info("release connectionManager: " + filePath);
httpClient.getConnectionManager().shutdown();
}
}
} catch (Exception e) {
logger.warn("do http post fail: ", e);
}
return "";
}
private static HttpPost getHttpPost(String postUrl, Map<String, String> headers,
Map<String, String> params, String filePath) {
HttpPost post = new HttpPost(postUrl);
String[] headerKeys = headers.keySet().toArray(new String[headers.keySet().size()]);
for (String key : headerKeys) {
post.setHeader(key, headers.get(key));
}
FileBody fileBody = new FileBody(new File(filePath));
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.addPart("express_image", fileBody);
String[] paramKeys = params.keySet().toArray(new String[params.keySet().size()]);
for (String key : paramKeys) {
StringBody valueBody = new StringBody(params.get(key), ContentType.TEXT_PLAIN);
multipartEntityBuilder.addPart(key, valueBody);
}
post.setEntity(multipartEntityBuilder.build());
return post;
}
}
最佳答案
我无法告诉你为什么内存不足,但我可以告诉你,这样做并不是一个好主意(尽管你使用了“推荐的方式”)。
我使用的是 4.5.3 版本中的 CloseableHttpClient
和 PoolingHttpClientConnectionManager
,而且我从不关闭它们(它们都在单例中分配一次并用于所有请求)。我的应用程序目前运行大约一个月后每秒执行一个请求(不是很多)。
请注意,为每个连接创建一个新客户端与为每次旅行购买一辆新车一样高效。
关于java - httpclient4.5.4中如何释放PoolingHttpClientConnectionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48002371/
我正在使用 Apache PoolingHttpClientConnectionManager 创建连接池。但是我在日志中看到现有的空闲连接未使用,而是创建了一个新连接。下面是代码 PoolingHt
我正在使用 Apache PoolingHttpClientConnectionManager 创建连接池。但是我在日志中看到现有的空闲连接未使用,而是创建了一个新连接。下面是代码 PoolingHt
我有以下声明: PoolingHttpClientConnectionManager manager; Android Studio 返回错误: 错误:(113, 9) 错误:找不到符号类 Pooli
我有一个问题,PoolingHttpClientConnectionManager 的 httpconnection 是什么? 我知道如果我们使用PoolingHttpClientConnection
我的程序包含以下行,此时挂起,我不太清楚为什么。 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClien
我正在使用 Spring 来实现以下目标: 在服务器上,我通过 REST 接口(interface)以 XML 格式接收数据。我想将数据转换为 JSON 并将其发布到另一个服务器。我的代码(我删除了一
所以我有一个 Spring 应用程序,我使用 PoolingHttpClientConnectionManager 为从此应用程序发出的所有 http 请求创建连接池。我只有一台主机可以调用,这意味着
org.apache.http.impl.conn.PoolingHttpClientConnectionManagerorg.apache.http.impl.nio.conn.PoolingNHt
我正在使用 httpClient 4.3.6,CloseableHttpClient 由 PoolingHttpClientConnectionManager 提供服务。 我当前的设置包括 200 个
这是我的使用方法- private static final PoolingHttpClientConnectionManager connPool; static { connPoo
我们想在 Glassfish 3.1 Open 的 EJB 容器中使用 HttpClient源版本。 在HttpClient documentation我们看到以下关于 BasicHttpClient
PoolingHttpClientConnectionManager 和 PoolingClientConnectionManager 之间有什么区别。为什么 PoolingClientConnect
我正在处理的 Web 服务需要将传入的 json 数据发送到另一个服务的 REST 接口(interface)。为此,我编写了一个依赖于 Apache 项目的 HttpClient-lib 的小转发器
我正在尝试使用我正在使用的客户端代码在服务器上使用连接池(已配置 Https SSL)PoolingHttpClientConnectionManager 和我有一个带连接池的工作代码,但我想知道我的
我正在编写一个需要运行许多并行 http 请求的服务。它也将部署在自动扩展环境中,但我希望从每个服务实例中获得尽可能多的性能。 我看到这篇文章How to determine the maximum
有人可以向我解释一下 setMaxPerRoute(max) 和 setMaxTotal(max) 在引用 HttpComponents PoolingHttpClientConnectionMana
所以我似乎在使用 PoolingHttpClientConnectionManager 时遇到与 DNS 主机名解析缓存相关的问题。我有一个可以调用外部服务的 api。此服务使用 Akamai 边缘缓
我们使用 Spring Boot 2 与 Actuator 和 Prometheus 来显示 Grafana 仪表板。我想添加 Apache Http Client PoolingHttpClient
我知道如何模拟 default HttpClient ,但是我如何模拟使用 PoolingHttpClientConnectionManager 创建的最新(v4.4)HttpClient与莫基托?
所以我最近在尝试使用 IDE 运行我们现有的测试套件时开始面临 TestNGException。最近我的意思是更新 intelliJ 和依赖项以尝试在最新版本上工作。失败的代码和堆栈跟踪如下 - 代码
我是一名优秀的程序员,十分优秀!