gpt4 book ai didi

java - HttpURLConnection 上的 Tomcat 内存泄漏警告

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:46:53 24 4
gpt4 key购买 nike

我在 Tomcat 8.5 中有以下警告我不确定我是否可以忽略

WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [AppName] appears to have started a thread named [pool-20-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
java.net.SocketInputStream.read(SocketInputStream.java:171)
java.net.SocketInputStream.read(SocketInputStream.java:141)
sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
sun.security.ssl.InputRecord.read(InputRecord.java:503)
sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)

它发生在以下代码中的 connect 上:

URL url = new URL(MY_URL);
URLConnection con = url.openConnection();
HttpURLConnection http = (HttpURLConnection) con;
http.setRequestMethod("POST");
http.setDoOutput(true);
http.setFixedLengthStreamingMode(out.length);
http.setRequestProperty("Content-Type", "application/json");
http.connect();
try (OutputStream os = http.getOutputStream()) {
os.write(out);
}

我应该添加一个 finally 并关闭 InputStream:

http.getInputStream().close();

或者应该升级/转换此代码以使用 URIBuilderHttpHost

编辑使用 Spring 的 @Scheduled

每 X 秒执行一次代码

最佳答案

您正在 Tomcat 中使用 @Scheduled 来生成线程。您必须确保这些线程将在 ServletContext 被销毁时完成,例如WAR 正在取消部署,Tomcat 会警告您这一点。 HTTP 请求代码不相关,因为 URLConnection 不会启动新线程来执行请求。

让 Tomcat 开心的一种方法是使用守护线程,如 this answer 中所述。 .这可以通过自定义 taskScheduler bean 来完成:

@Configuration
@EnableScheduling
public class TaskConfiguration {

@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.Executors.newFixedThreadPool(4,
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true);
return t;
}
});
}

}

关于java - HttpURLConnection 上的 Tomcat 内存泄漏警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51818025/

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