2011-07-17 96 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而不是線程,並檢查線程以查看哪些線程導致了問題。