2011-07-17 4 views
4

に失敗した私は最近、Androidマーケットで私のアプリをアップロードし、私はそれをトレースバックカント次のエラー取得しています:私はそれが外で理解アンドロイド: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はコード内で開始される情報を提供していません。 AsyncTasksとスレッドがたくさんある比較的大きなアプリケーション(20個のアクティビティ)があるので、私はそれを追跡するのに苦労しています。どこから始めるべきかわからない。どんな助けでも有益になります

答えて

4

あなたのアプリを再設計する必要があります。どのような状況においても、20の活動を行うべきではありません。 AsyncTasksとThreadsをたくさん追加するだけで問題が悪化します。より少ないメモリを使用するために、アクティビティまたは非同期タスクの一部をまとめて検討してください。残念ながら、これを修正するために呼び出す魔法の方法はありません。 DDMSでスレッド・プロファイリングを使用して、どのスレッドが最も多くのメモリーを使用しているかを確認できます。どこから始めるかを見つけるのに役立つはずです。これを行うには、デバイスを接続するか、エミュレータを起動します。 Eclipseでは、DDMSに行き、左側のパネルでアプリのパッケージ名を選択します。 [スレッドの更新]ボタンをクリックすると、アプリケーションが使用しているすべてのスレッドが右側のパネルに表示されます。あなたは1つをクリックしてRefreshを押して、それに関する更なる情報を得ることができます。あなたのメモリがどこにあるのかを知るには、あなたのアプリのパッケージをクリックし、 "Update Heap"(ちょっと緑色のゴミ箱のように見えます)をヒットします。これはあなたのアプリが記憶しているすべてのものを表示します。それは少なくともあなたが始めるのに役立つはずです。

0

あなたはAsynTasksならびにこのスニペットと一緒に活動してログインすることができます -

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

問題が現れ始める場所のアイデアを得るために、表示メモリ情報を取得します。

また、onLowMemoryにブレークポイントを設定して、スレッドではなくVMをフリーズさせ、スレッドを調べて問題の原因となっているかどうかを確認してください。

関連する問題