有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Android HttpClient使用java使应用程序崩溃。lang.OutOfMemoryError:pthread_create

我最近在应用程序崩溃时遇到了一个异常:

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多个线程,这解释了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)。我想知道是什么原因造成了如此多的线程

谢谢


共 (0) 个答案