Java web应用程序似乎已启动名为的线程,但未能停止该线程。这很可能会造成内存泄漏
我正在使用java中的hosebird客户端使用twitter流api获取实时推文 运行数小时后,出现以下异常Java web应用程序似乎已启动名为的线程,但未能停止该线程。这很可能会造成内存泄漏,java,multithreading,tomcat,twitter,web-applications,Java,Multithreading,Tomcat,Twitter,Web Applications,我正在使用java中的hosebird客户端使用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
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)
如前所述,我试图将hosebird客户机线程更改为守护进程线程,但仍然没有成功
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);
任何线索都将不胜感激 修复了线程的内存泄漏,方法是在不再需要时停止线程,然后重新启动
if(hosebirdClient.isDone())
{
hosebirdClient.stop();
updateSystmeParameters(0, getCurrentTimeStamp(), "NA");
Search.startFirehoseFilter(); // this function restart the thread
}
在初始化客户机的地方发布代码片段,并对其执行一些操作。我猜你忘了在某些流程中关闭客户端。是的,你是对的,我停止了客户端,然后就重新启动了客户端!