1

私のアプリは最初の実行で正常に実行されますが、再起動するとクラッシュし、強制的に閉じます。強制終了ボタンを押した後、アプリを再開できます。戻るボタンを押した後に再起動しようとすると、強制的に閉じる必要があります。私は他のすべての試みでエラーなしでそれを実行させます。私はアンドロイドがコンピュータにメモリを返すことを処理することになっていると思ったので、そのハウスキーピングを行う必要はありません:私はやや大きな配列を持っています:

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

私のコンストラクターでは、短縮する必要があるかもしれません。しかし、私は最初の試みで動作します。猫のメッセージを記録する:

05-08 19:09:46.0​​35:E / dalvikvm-heap(420):28バイトの割り当てでメモリ不足。

05-08 19:09:46.195:I / dalvikvm(420):| group = "main" sCount = 0 dsCount = 0 s = N obj = 0x4001d8e0 self = 0xccb0 05-08 19:09:46.195:I / dalvikvm(420):| sysTid = 420 nice = 0 sched = 0/0 cgrp = default handle = -1345026008 05-08 19:09:46.205:I / dalvikvm(420):| schedstat =(52616400652 22917249866 1196)05-08 19:09:46.205:I / dalvikvm(420):at 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:

05-08 19:09:47.045:I / dalvikvm(420):| group = "main" sCount = 1 dsCount = 0 s = N obj = 0x4001d8e0 self = 0xccb0 05-08 19:09:47.045:I / dalvikvm(420):| sysTid = 420 nice = 0 sched = 0/0 cgrp = default handle = -1345026008 05-08 19:09:47.045:I / dalvikvm(420):| schedstat =(52980087202 23270903160 1219)05-08 19:09:47.045:I / dalvikvm(420):at 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):at java.lang.reflect.Method.invoke(Method.java:521)05-08 19:09:47.195:I / dalvikvm(420):at 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ネイティブ05-0819:09:47.195:I / dalvikvm(420):| group = "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 = default handle = 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): || group = "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 = default handle = 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):| group = "system" sCount = 1 dsCount = 0 s = N obj = 0x44f352a0 self = 0x135ad0 05-08 19:09:47.755:I / dalvikvm(420):| sysTid = 423 nice = 0 sched = 0/0 cgrp = default handle = 1196352 05-08 19:09:47.765:I / dalvikvm(420):| schedstat =(59551849 158373474 18)05-08 19:09:47.765:I / dalvikvm(420):dalvik.system.NativeStart.run(ネイティブメソッド)05-08 19:09:47.775:I / dalvikvm(420) :「SignalCatcher」デーモンprio = 5 tid = 3 VMWAIT 05-08 19:09:47.886:I / dalvikvm(420):| group = "system" sCount = 1 dsCount = 0 s = N obj = 0x44f351e8 self = 0x125550 05-08 19:09:47.886:I / dalvikvm(420):| sysTid = 422 nice = 0 sched = 0/0 cgrp = default handle = 1240608 05-08 19:09:47.886:I / dalvikvm(420):| schedstat =(2639901 40055709 3)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):| group = "system" sCount = 0 dsCount = 0 s = N obj = 0x438b8e50 self = 0x12ece0 05-08 19:09:47.886:I / dalvikvm(420):| sysTid = 421 nice = 0 sched = 0/0 cgrp = default handle = 1195896 05-08 19:09:47.906:I / dalvikvm(420):| schedstat =(4477669539 2785983510 211)05-08 19:09:47.906:I / dalvikvm(420):com.android.internal.os.BinderInternal $ GcWatcher.finalize(BinderInternal.java:~48)05-08 19: 09:47.906:I / dalvikvm(420):dalvik.system.NativeStart.run(ネイティブメソッド)05-08 19:09:47.906:D / dalvikvm(420):threadid = 2:2つのSIGSTKFLTをthreadid=2に送信(tid = 421)debuggerdダンプを発生させる05-08 19:09:57.895:D / dalvikvm(420):送信、debuggerdの実行を一時停止05-08 19:10:05.956:D / dalvikvm(420):続行05 -08 19:10:05.956:E / dalvikvm(420):VMが異常終了します

4

2 に答える 2

1

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

このトリックにより、メモリ使用量が数回削減されます。これは、配列と各項目の Java メモリ オーバーヘッドに関連しています。詳細については、こちらを参照してください。 http://www.javamex.com/tutorials/memory/array_memory_usage.shtml

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

于 2012-05-08T19:56:06.053 に答える
0

コードの残りの部分を見ないと、エラーが毎回発生する理由はわかりません。使用している静的変数はありますか?

ただし、メモリ消費量を 3 分の 1 に減らすためのアドバイスはできます。RGB 画像を保存しようとしているようです。問題は、赤、緑、青の各ピクセルが 1 バイトしか必要としないのに、4 バイトの int を与えていることです。より良いアプローチは、以下を使用して赤、緑、および青を単一の int にエンコードすることです:int color = Color.rgb(red, geen, blue)そうすれば、配列を初期化するだけで済みint[] worldgrid= new int[640][480]、メモリ使用量を 3 分の 1 に削減できます。

さらに、おそらくそれを多次元配列として保存することさえしないでint[] worldgrid = new int[640*480];ください。配列にインデックスを付けるときは、次のようにします。int result = worldgrid[row + col*640];

于 2012-05-08T20:02:58.593 に答える