1

我的应用程序在第一次运行时运行良好,但如果我重新启动它会崩溃并让我强制关闭。在我按下强制关闭按钮后,我可以再次启动应用程序。如果我在按下后退按钮后尝试重新启动,我必须强制关闭。我让我每次尝试都运行它而不会出错。我认为 android 应该负责将内存返回给计算机,所以我们不必做那些家务:我确实有一个有点大的数组:

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

在我的构造函数中,我可能不得不缩短它。我确实做了第一次尝试。记录猫消息:

05-08 19:09:46.035:E/dalvikvm-heap(420):28 字节分配内存不足。

05-08 19:09:46.195:我/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=默认句柄=-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(Native Method) 05-08 19:09:46.205: I/dalvikvm( 420): at java.lang.reflect.Array.newInstance(Array.java:444) 05-08 19:09:46.455: I/dalvikvm(420): at 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=默认句柄=-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(Native Method) 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): 在 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): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 05-08 19 :09:47.195: I/dalvikvm(420): at dalvik.system.NativeStart.main(Native Method) 05-08 19:09:47.195: I/dalvikvm(420): "Binder Thread #2" prio=5 tid =6 本地 05-08 19: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 句柄=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。运行(本机方法)05-08 19:09:47.195:I/dalvikvm(420):“Binder Thread #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 句柄=1269616 05-08 19:09:47.750: I/dalvikvm(420): | schedstat=( 114332827 305656917 35 ) 05-08 19:09:47.750: I/dalvikvm(420): at dalvik.system.NativeStart.run(Native Method) 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=默认句柄=1196352 05-08 19:09:47.765: I/dalvikvm(420): | schedstat=( 59551849 158373474 18 ) 05-08 19:09:47.765: I/dalvikvm(420): at dalvik.system.NativeStart.run(Native Method) 05-08 19:09:47.775: I/dalvikvm(420) :“信号捕手”守护进程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 句柄=1240608 05-08 19:09:47.886: I/dalvikvm(420): | schedstat=( 2639901 40055709 3 ) 05-08 19:09:47.886: I/dalvikvm(420): at dalvik.system.NativeStart.run(Native Method) 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: 我/dalvikvm(420):| sysTid=421 nice=0 sched=0/0 cgrp=default 句柄=1195896 05-08 19:09:47.906: I/dalvikvm(420): | schedstat=( 4477669539 2785983510 211 ) 05-08 19:09:47.906: I/dalvikvm(420): at com.android.internal.os.BinderInternal$GcWatcher.finalize(BinderInternal.java:~48) 05-08 19: 09:47.906: I/dalvikvm(420): at dalvik.system.NativeStart.run(Native Method) 05-08 19:09:47.906: D/dalvikvm(420): threadid=2: 发送两个 SIGSTKFLTs 到 threadid=2 (tid=421) 导致调试器转储 05-08 19:09:57.895: D/dalvikvm(420): 发送,暂停让调试器运行 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 倍。看起来您正在尝试存储 rgb 图像。问题是每个红色、绿色或蓝色像素只需要一个字节,但你给它一个 int 是 4 个字节。更好的方法是使用以下方法将红色、绿色和蓝色编码为单个 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];

于 2012-05-08T20:02:58.593 回答