8

我在一家小型 Android 游戏开发公司工作,目前我遇到了问题。我正在运行一个非常标准的 windows 7 x64 机器,带有 Eclipse 和 Android SDK。

我正在阅读我的程序的 LogCat 输出,想知道为什么我的游戏甚至不显示。我很快看到所有堆都在增长,并认为我可能有太多纹理/太大的纹理等。我将问题定位为纹理加载,然后我开始使用 DDMS,发现我的堆不会增长到 19MB 以上。我剪掉了几个纹理并尝试再次构建和运行。令我震惊的是,堆不会一直增长到超过 6.6MB。有没有人有什么建议?

tl;dr:我的堆增长到 19MB,然后失败了,所以我取出了更消耗内存的纹理,将其保持在堆中的 19MB 以下,现在我的堆不会超过 6.6MB。

编辑:取出较大纹理时的 logcat 输出:

08-19 19:19:53.744:调试/dalvikvm(4699):GC_FOR_MALLOC 在 49 毫秒内释放了 91 个对象/514016 个字节
08-19 19:19:54.184:调试/dalvikvm(4699):GC_FOR_MALLOC 在 48 毫秒内释放了 104 个对象/494088 个字节
08-19 19:19:54.404:WARN/ActivityManager(59):启动超时已过期,放弃唤醒锁!
08-19 19:19:54.764:调试/dalvikvm(4699):GC_FOR_MALLOC 在 49 毫秒内释放了 85 个对象/384664 个字节
08-19 19:19:54.935: WARN/ActivityManager(59): HistoryRecord{4612eec8 com.wickeyware.zombiearcher.android/.AndroidGame} 的活动空闲超时
08-19 19:19:55.234:调试/dalvikvm(4699):GC_FOR_MALLOC 在 47 毫秒内释放了 104 个对象/504648 个字节
08-19 19:19:55.875:调试/dalvikvm(4699):GC_FOR_MALLOC 在 55 毫秒内释放了 85 个对象/505712 个字节
08-19 19:19:56.905:调试/dalvikvm(4699):GC_FOR_MALLOC 在 50 毫秒内释放了 104 个对象/522392 个字节
08-19 19:19:57.535:调试/dalvikvm(4699):GC_FOR_MALLOC 在 50 毫秒内释放了 56 个对象/388896 个字节
08-19 19:19:57.695: INFO/WindowManager(59): WIN DEATH: Window{4606a8a0 com.android.launcher/com.android.launcher2.Launcher paused=false}
08-19 19:19:57.705: INFO/ActivityManager(59): 进程 com.android.launcher (pid 4669) 已经死亡。
08-19 19:19:57.825:INFO/ActivityManager(59):内存不足:没有更多的后台进程。
08-19 19:19:57.865: INFO/dalvikvm(4699): dvmDdmHandleHpsgChunk(当 1, 什么 0, 堆 0)
08-19 19:19:58.575: DEBUG/ddm-heap(4699): 堆 GC 请求
08-19 19:19:58.685:调试/dalvikvm(4699):GC_EXPLICIT 在 106 毫秒内释放了 48 个对象/313440 个字节
08-19 19:20:01.015: INFO/ActivityManager(59): 进程 jp.co.omronsoft.openwnn (pid 4677) 已经死亡。
08-19 19:20:01.095:WARN/ActivityManager(59):计划在 5000 毫秒内重新启动崩溃的服务 jp.co.omronsoft.openwnn/.OpenWnnJAJP
08-19 19:20:01.106:INFO/ActivityManager(59):内存不足:没有更多的后台进程。
08-19 19:20:03.105: INFO/ActivityManager(59): 进程 com.wickeyware.zombiearcher.android (pid 4699) 已经死亡。
08-19 19:20:03.155: INFO/WindowManager(59): WIN DEATH: Window{46138b68 SurfaceView paused=false}
08-19 19:20:03.275: INFO/WindowManager(59): WIN DEATH: Window{4612d530 com.wickeyware.zombiearcher.android/com.wickeyware.zombiearcher.android.AndroidGame paused=false}
08-19 19:20:03.425:INFO/ActivityManager(59):为活动 com.android.launcher/com.android.launcher2.Launcher 启动 proc com.android.launcher:pid=4710 uid=10025 gids={}
08-19 19:20:03.425:INFO/ActivityManager(59):内存不足:没有更多的后台进程。
08-19 19:20:03.775:INFO/UsageStats(59):com.android.launcher 意外恢复,而 com.wickeyware.zombiearcher.android 已经恢复
08-19 19:20:03.904: INFO/ActivityThread(4710): 发布提供者 com.android.launcher2.settings: com.android.launcher2.LauncherProvider
08-19 19:20:04.005:调试/dalvikvm(4710):GC_EXTERNAL_ALLOC 在 58 毫秒内释放了 985 个对象/73440 个字节
08-19 19:20:04.465: WARN/InputManagerService(59): 收到 RemoteException 向 pid 4699 uid 10036 发送 setActive(false) 通知
08-19 19:20:04.984:INFO/ActivityManager(59):显示的活动 com.android.launcher/com.android.launcher2.Launcher:1703 毫秒(总共 20584 毫秒)
08-19 19:20:06.124:INFO/ActivityManager(59):为服务 jp.co.omronsoft.openwnn/.OpenWnnJAJP 启动 proc jp.co.omronsoft.openwnn:pid=4718 uid=10023 gids={}
4

2 回答 2

1
GC_FOR_MALLOC freed 104 objects / 504648 bytes in 47ms

这是垃圾收集器触发。不幸的是,没有任何来源,这里没有人可以帮助您。

但是,看起来您正在实例化太多对象,而垃圾收集器几乎一直在触发。

于 2012-02-28T16:31:11.397 回答
0

你好。我不太确定我的答案是否正确,但我遇到了类似的问题。

问题在于为某些对象创建新纹理。我做了太多次,结果是类似的例外。我的解决方案:在为对象设置新纹理之前,我删除了旧纹理。

例如:

// Delete a texture
int[] textures = { textureId };
gl.glDeleteTextures(1, textures, 0);

// Create new texture ...

或者:

int oldTextureId = textureId;
...
// Create new texture
...
// Delete texture
int[] textures = { oldTextureId };
gl.glDeleteTextures(1, textures, 0);
于 2012-02-27T21:56:59.453 回答