2011-07-17 59 views
4

我最近上传我的应用程序在Android Market上,我收到以下错误,我不能追根溯源:安卓:java.lang.OutOfMemoryError:线程创建失败

java.lang.OutOfMemoryError: thread creation failed 
at java.lang.VMThread.create(Native Method) 
at java.lang.Thread.start(Thread.java:1327) 
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:901) 
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:950) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1086) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
at java.lang.Thread.run(Thread.java:1096) 

我的理解是出内存错误,但stacktrace在我的代码中没有提供任何信息。所以我很努力追踪它,因为我有一个相对较大的应用程序(20个活动)以及许多AsyncTasks和线程。不知道从哪里开始。任何帮助将是有益的

回答

4

你需要重新设计你的应用程序。在任何情况下你都不应该有20项活动。添加大量的AsyncTasks和Threads只会加剧问题。考虑将你的一些活动或AsyncTasks集中在一起,以便使用更少的内存。不幸的是,没有什么神奇的方法可以解决这个问题。您可以使用DDMS中的线程分析功能来查看哪些线程正在使用最多的内存;这应该可以帮助你找到从哪里开始。为此,请插入设备/启动仿真器。在Eclipse中,转到DDMS并在左侧面板中选择应用程序的包名称。点击“Update Threads”按钮,你的应用程序正在使用的所有线程都会出现在右侧面板上。您可以点击其中一个,点击刷新获取更多信息。要查看你的内存在哪里,点击你的应用程序包并点击“更新堆”(看起来像一个绿色的垃圾桶。)在右侧面板上的堆,然后点击原因GC。这会告诉你你的应用程序在内存中的所有内容。这应该至少可以帮助你开始。

0

可以在AsynTasks以及在这个片段中一起活动的记录 -

MemoryInfo mi = new MemoryInfo(); 
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
activityManager.getMemoryInfo(mi); 
long availMem = mi.availMem ; 

让显示内存信息,以获得那里的问题开始出现的想法。

另外,考虑在onLowMemory中设置一个突破点,并确保它冻结了VM而不是线程,并检查线程以查看哪些线程导致了问题。