2012-05-08 4 views
1

私のアプリはうまく動作しますが、再起動するとクラッシュして強制終了させて​​しまいます。私は強制終了ボタンを押した後、私は再びアプリを起動することができます。私はバックボタンを押した後に再起動しようとすると、強制的に閉じる必要があります。他のすべての試みをエラーなく実行できます。私のコンストラクタで他のすべての実行時には、Androidで

int worldgrid= new int[640][480][3]; 

、私はそれを短くする必要があります:私は、やや大きな配列を持っている:私は、Androidが、我々はその家事を行うには持っていけないので、コンピュータにメモリを返すの世話をすることになったと思いました。私は最初の試みをします。

5月8日19:09:46.0​​35:E/dalvikvm-ヒープ(420):28バイト 配分上のメモリのうちの猫のメッセージを記録。

05-08 19:09:46.195:I/dalvikvm(420):|グループ= "メイン" sCount = 0 dsCount = 0 s = N obj = 0x4001d8e0自己= 0xccb0 05-08 19:09:46.195: I/dalvikvm(420):| sysTid = 420 nice = 0 sched = 0/0 cgrp = default ハンドル= -1345026008 05-08 19:09:46.205:I/dalvikvm(420):| schedstat =(52616400652 22917249866 1196)05-08 19:09:46.205: I/dalvikvm(420):java.lang.reflect.Array.createMultiArray(ネイティブ メソッド)05-08 19:09:46.205:I/dalvikvm(420): java.lang.reflect.Array.newInstance(Array.java:444)05-08 19:09:46.455:I/dalvikvm(420): com.gravedigger.MainGamePanel。( MainGamePanel.java:215)05-08 19:09:46.455:I/dalvikvm(420): com.digger.DiggerActivity.onCreate(GravediggerActivity.java:116)05-08 19:09:46.615:I/dalvikvm(420): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 05-08 19:09:46.625:I/dalvikvm(420): android.app.ActivityThread.pe rformLaunchActivity(ActivityThread.java:2627) 05-08 19:09:46.765:I/dalvikvm(420): android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 05-08 19:09:46.765 :I/dalvikvm(420): android.app.ActivityThread.access $ 2300(ActivityThread.java:125)05-08 19:09:46.775:I/dalvikvm(420): android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033) 05-08 19:09:46.775:I/dalvikvm(420): android.os.Handler.dispatchMessage(Handler.java:99)05-08 19:09 (Looper.java:123)05-08 19:09:46.785: I/dalvikvm(420): でandroid.app.ActivityThread 。メイン(ActivityThread.java:4627)05-08 19:09:46.895:I/dalvikvm(420): でjava.lang.reflect.Method.invokeNative(ネイティブメソッド)05-08 19:09:46.895:I/dalvikvm(420):at java.lang.reflect.Method.invoke(Method.java:521)05-08 19:09:46.895: I/dalvikvm(420): com.android.internal.os .ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 05-08 19:09:46.895:I/dalvikvm(420): でcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 05-08 19:09:46.905:I/dalvikvm(420): dalvik.system.NativeStart.main(ネイティブメソッド)05-08 19:09:47.038: E/dalvikvm(420):HeapWorkerが詰まっています:11152msは内部で過ごしました Lcom/android/interna I/dalvikvm(420):DALVIK THREADS:05-08 19:09:47.045: I/dalvikvm(420):I/dalvikvm "main" prio = 5 tid = 1 VMWAIT

05-08 19:09:47045:I/dalvikvm(420):|グループ= "メイン" sCount = 1 dsCount = 0 s = N obj = 0x4001d8e0自己= 0xccb0 05-08 19:09:47.045: I/dalvikvm(420):| sysTid = 420 nice = 0 sched = 0/0 cgrp = default ハンドル= -1345026008 05-08 19:09:47.045:I/dalvikvm(420):| schedstat =(52980087202 23270903160 1219)05-08 19:09:47.045: I/dalvikvm(420):java.lang.reflect.Array.createMultiArray(ネイティブ メソッド)05-08 19:09:47.045:I/dalvikvm(420): java.lang.reflect.Array.newInstance(Array.java:444)05-08 19:09:47.045:I/dalvikvm(420): com.digger.MainGamePanel。( MainGamePanel.java:215)05-08 19:09:47.045:I/dalvikvm(420): com.digger.DiggerActivity.onCreate(GravediggerActivity.java:116)05-08 19:09:47.045:I/dalvikvm(420): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 05-08 19:09:47.185:I/dalvikvm(420): android.app.ActivityThread.perform LaunchActivity(ActivityThread.java:2627) 05-08 19:09:47.185:I/dalvikvm(420): android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 05-08 19:09:47.195 :I/dalvikvm(420): android.app.ActivityThread.access $ 2300(ActivityThread.java:125)05-08 19:09:47.195:I/dalvikvm(420): android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033) 05-08 19:09:47.195:I/dalvikvm(420): android.os.Handler.dispatchMessage(Handler.java:99)05-08 19:09 (Looper.java:123)05-08 19:09:47.195: I/dalvikvm(420): android.app.ActivityThread .main(Acti (ネイティブメソッド)05-08 19:09:47.195:I/dalvikvm(420):で、 dalvikvm(420): java.lang.reflect.Method.invoke(Method.java:521)05-08 19:09:47.195: I/dalvikvm(420): com.android.internal.os。 ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 05-08 19:09:47.195:I/dalvikvm(420): でcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)05 -08 19:09:47.195:I/dalvikvm(420): でdalvik.system.NativeStart.main(ネイティブメソッド)05-08 19:09:47.195: I/dalvikvm(420): "バインダースレッド# 2 "prio = 5 tid = 6 NATIVE 05-08 19:09:47.195:I/dalvikv m(420):|グループ= "main" sCount = 1 dsCount = 0 s = N obj = 0x44f366b8 self = 0x11d230 05-08 19:09:47.195:I/dalvikvm(420):| sysTid = 425 nice = 0 sched = 0/0 cgrp =デフォルトハンドル= 1297528 05-08 19:09:47.195:I/dalvikvm(420):| schedstat =(118912719 416670422 51 )05-08 19:09:47.195:I/dalvikvm(420): でdalvik.system.NativeStart.run(ネイティブメソッド)05-08 19:09:47.195: I/dalvikvm (420): "バインダースレッド#1" prio = 5 tid = 5 NATIVE 05-08 19:09:47.195:I/dalvikvm(420):|グループ= "main" sCount = 1 dsCount = 0 s = N obj = 0x44f36480 self = 0x11fd80 05-08 19:09:47.750:I/dalvikvm(420):| sysTid = 424 nice = 0 sched = 0/0 cgrp =デフォルトハンドル= 1269616 05-08 19:09:47.750:I/dalvikvm(420):| schedstat =(114332827 305656917 35 )05-08 19:09:47.750:I/dalvikvm(420): でdalvik.system.NativeStart.run(ネイティブメソッド)05-08 19:09:47.755: I/dalvikvm (420): "JDWP"デーモンprio = 5 tid = 4 VMWAIT 05-08 19:09:47.755: I/dalvikvm(420):|グループ= "システム" sCount = 1 dsCount = 0 s = N obj = 0x44f352a0自己= 0x135ad0 05-08 19:09:47.755:I/dalvikvm(420):| sysTid = 423 nice = 0 sched = 0/0 cgrp =デフォルトハンドル= 1196352 05-08 19:09:47。765:I/dalvikvm(420):| dalvik.system.NativeStart.run(ネイティブメソッド)05-08 19:09:47.775: I/dalvikvm (420): "シグナルキャッチャー"デーモンprio = 5 tid = 3 VMWAIT 05-08 19:09:47.886:I/dalvikvm(420):|グループ= "システム" sCount = 1 dsCount = 0 s = N obj = 0x44f351e8自己= 0x125550 05-08 19:09:47.886:I/dalvikvm(420): | sysTid = 422 nice = 0 sched = 0/0 cgrp =デフォルトハンドル= 1240608 05-08 19:09:47.886:I/dalvikvm(420):| dalvik.system.NativeStart.run(ネイティブメソッド)05-08 19:09:47.886: I/dalvikvm (420): "HeapWorker"デーモンprio = 5 tid = 2 RUNNABLE 05-08 19:09:47.886:I/dalvikvm(420):|グループ= "システム" sCount = 0 dsCount = 0 s = N obj = 0x438b8e50自己= 0x12ece0 05-08 19:09:47.886:I/dalvikvm(420): | sysTid = 421 nice = 0 sched = 0/0 cgrp =デフォルトハンドル= 1195896 05-08 19:09:47.906:I/dalvikvm(420):| (BinderInternal.java:~48) 05-556-com.android.internal.os.BinderInternal $ GcWatcher.finalize(BinderInternal.java:~48)05- D/dalvikvm(420):threadid = 2:2つのデータを送信する場合は、次のように入力します。デバッグダンプを発生させるためにSIGSTKFLTs = 2 (tid = 421)デバッグダンプを引き起こすために05-08 19:09:57.895:D/dalvikvm(420): 送信され、デバッガを05-08 19:10:05.956: D/dalvikvm(420):継続5月8日19:10:05.956:E/dalvikvm(420):VM 中断

答えて

1

おそらく、あまりにもかなり大きい配列をメモリに持っているのは良くありません。 しかし、とにかく、あなたの配列をこのようにリファクタリングすることによって、メモリ使用量を減らすことができます: int worldgrid = new int [3] [480] [640];

このトリックは、メモリ使用量を何度か減らします。配列や各項目のJavaメモリオーバーヘッドに関連しています。詳細はここにあります。

また、配列へのリンクを保持していないことを確認すると、メモリからの削除が防止されます。ガベージコレクタは、すべてのリンクを削除した直後にメモリから削除されません。だから、あなたがnullに等しい配列へのリンクを作っていないなら、それはメモリに保存されます。あなたのアプリを再起動すると(アクティビティが完全に殺されたという保証はありません)、onCreateで配列を作成しようとします)古い配列はまだ削除できません。

0

他のコードを見ずにエラーが発生する理由を教えてもらえません。使用している静的変数はありますか?

しかし、私はあなたのメモリ消費を3倍に減らすための助言を与えることができます。あなたはrgbイメージを格納しようとしているようです。問題は、赤、緑、青の各ピクセルに1バイトしか必要ないが、4バイトのintを与えているということです。より良い方法は、赤、緑、青を単一のintにコード化することです:int color = Color.rgb(red, geen, blue)あなたは配列をint[] worldgrid= new int[640][480]に初期化するだけで、3の係数でメモリの使用量を減らす必要があります。

さらにおそらくint[] worldgrid = new int[640*480];を実行し、配列にインデックスを付けるときは、次のようにしてください:int result = worldgrid[row + col*640];

関連する問題