代码之家  ›  专栏  ›  技术社区  ›  Ori Marko

HttpURLConnection上的Tomcat内存泄漏警告

  •  3
  • Ori Marko  · 技术社区  · 6 年前

    Tomcat8.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);
    }
    

    我应该在结束 InputStream :

    http.getInputStream().close();
    

    或者应该升级/转换此代码以使用 URIBuilder HttpHost ?

    使用Spring的 @Scheduled

    1 回复  |  直到 6 年前
        1
  •  1
  •   Karol Dowbecki    6 年前

    你在用 @Scheduled 在Tomcat中生成线程。您必须确保这些线程在 ServletContext URLConnection 不启动新线程来执行请求。

    this answer . 这可以通过定制来完成 taskScheduler 豆子:

    @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;
              }
            });
      }
    
    }
    
    推荐文章