【问题标题】:The web application appears to have started a thread named but has failed to stop it. This is very likely to create a memory leakWeb 应用程序似乎已经启动了一个名为但未能停止它的线程。这很可能造成内存泄漏
【发布时间】:2017-12-26 00:51:49
【问题描述】:

我在 java 中使用软管鸟客户端来使用 twitter 流 api 获取实时推文。

运行几个小时后给出以下异常。

18-Jul-2017 15:35:50.034 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [hosebird-client-io-thread-0] 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.readDataRecord(SSLSocketImpl.java:940)
 sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
 org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
 org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
 org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
 org.apache.http.impl.conn.LoggingSessionInputBuffer.readLine(LoggingSessionInputBuffer.java:115)
 org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:251)
 org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:209)
 org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:171)
 org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
 java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238)
 java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
 java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
 com.twitter.hbc.common.DelimitedStreamReader.readLine(DelimitedStreamReader.java:72)
 com.twitter.hbc.common.DelimitedStreamReader.readLine(DelimitedStreamReader.java:56)
 com.twitter.hbc.core.processor.StringDelimitedProcessor.processNextMessage(StringDelimitedProcessor.java:53)
 com.twitter.hbc.core.processor.StringDelimitedProcessor.processNextMessage(StringDelimitedProcessor.java:26)
 com.twitter.hbc.core.processor.AbstractProcessor.process(AbstractProcessor.java:46)
 com.twitter.hbc.httpclient.Connection.processResponse(Connection.java:51)
 com.twitter.hbc.httpclient.ClientBase.processConnectionData(ClientBase.java:244)
 com.twitter.hbc.httpclient.ClientBase.run(ClientBase.java:144)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:748)

here 所述,我尝试将软管鸟客户端线程更改为守护线程,但仍然没有运气。

public static Thread getThreadByName(String threadName) {
    for (Thread t : Thread.getAllStackTraces().keySet()) {
        System.out.println("Thread is: "+ t.getName());
        if (t.getName().contains(threadName)) return t;
    }
    return null;
}

getThreadByName("hosebird-client-io-thread").setDaemon(true);

任何线索将不胜感激!

【问题讨论】:

  • 将您的代码 sn-p 发布到您正在初始化客户端的位置并对其进行一些操作。我的猜测是您忘记在某些流程中关闭客户端。
  • 是的,你是对的,我停止了客户端,然后重新启动了客户端!

标签: java multithreading tomcat twitter web-applications


【解决方案1】:

通过在不再需要时停止线程并重新启动来修复线程的内存泄漏。

if(hosebirdClient.isDone())
        {
            hosebirdClient.stop();
            updateSystmeParameters(0, getCurrentTimeStamp(), "NA");
            Search.startFirehoseFilter(); // this function restart the thread 

        }

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2017-11-10
    • 2017-06-09
    • 2014-09-27
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多