我最近遇到了这个异常导致应用崩溃:
在崩溃报告中,我能看到超过1000个线程(RefQueueWorker)被创建,这解释了OOM。所有的线程都在等待,以下是转储内容:
获取 HttpClient 使用的代码为:
java.lang.OutOfMemoryError: pthread_create (stack size 16384 bytes) failed: Try again
at java.lang.VMThread.create(VMThread.java)
at java.lang.Thread.start(Thread.java:1029)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:920)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:988)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
在崩溃报告中,我能看到超过1000个线程(RefQueueWorker)被创建,这解释了OOM。所有的线程都在等待,以下是转储内容:
RefQueueWorker@org.apache.http.impl.conn.tsccm.ConnPoolByRoute@43b42098
at java.lang.Object.wait(Object.java)
at java.lang.Object.wait(Object.java:401)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
at org.apache.http.impl.conn.tsccm.RefQueueWorker.run(RefQueueWorker.java:102)
at java.lang.Thread.run(Thread.java:841)
(...)
RefQueueWorker@org.apache.http.impl.conn.tsccm.ConnPoolByRoute@45f62f08
at java.lang.Object.wait(Object.java)
at java.lang.Object.wait(Object.java:401)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
at org.apache.http.impl.conn.tsccm.RefQueueWorker.run(RefQueueWorker.java:102)
at java.lang.Thread.run(Thread.java:841)
获取 HttpClient 使用的代码为:
public static HttpClient getHttpClient(Context context)
{
HttpClient httpClient = AndroidHttpClient.newInstance("appname", context);
HttpParams params = httpClient.getParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);
return httpClient;
}
每个请求都要在 finally 块中关闭 AndroidHttpClient :
...
finally
{
if ((client instanceof AndroidHttpClient))
{
((AndroidHttpClient) client).close();
}
}
我无法重现这个崩溃,它只发生在一个用户身上(Nexus 5 / API 4.4.2)。我想知道这么多线程被创建的根本原因是什么?
谢谢。