Android dalvikvm-heap:Clamp target GC heap

时间:2010-11-11 14:14:40

标签: java android memory-management memory-leaks garbage-collection

我正在编写一个程序来将大量联系人与Android Contacts数据库同步。下载适用于大约700个联系人,之后我一直得到一个内存堆错误,它调用无限数量的GC语句并最终重新启动电话。我正面临着HTC欲望的问题。

我使用DDMS中的Heap alocation工具检查了应用程序的堆大小,并使用Debug.dumpHprofData提取了hprof文件。两个日志都表明堆大小约为2.4MB。

但是我得到以下日志,表明堆大小超过32.MB

dalvikvm-heap(92): Clamp target GC heap from 33.999MB to 32.000MB
dalvikvm(92): GC_FOR_MALLOC freed 2 objects / 48 bytes in 313ms

我在循环中插入了以下日志语句,其中写了我的contatcs下载逻辑。

Log.e("Memory", "free mem =" +runtime.freeMemory());
Log.e("Memory", "total memory =" +runtime.totalMemory());

这些是打印声明的初始值和最终值

---------------------------------------------------------------
11-11 12:56:04.168: ERROR/Memory(25132): free mem =871248
11-11 12:56:04.168: ERROR/Memory(25132): total memory =4202464

---------------------------------------------------------------

11-11 13:01:55.408: ERROR/Memory(25132): free mem =891640
11-11 13:01:55.408: ERROR/Memory(25132): total memory =4726752

---------------------------------------------------------------

这表明同步联系人逻辑中没有内存泄漏。

有人可以告诉我为什么堆大小增加(高达32.00Mb)到设备重新启动的程度?我是Android和Java的新手,所以请放轻松我:).....

3 个答案:

答案 0 :(得分:8)

虽然这不是最佳答案,但我强烈建议您观看Google IO 2011上Memory management for Android Apps演讲的视频。它可以很好地解释如何管理内存以及您看到的消息内容实际上是指。

答案 1 :(得分:2)

您需要发布您的代码,以便任何人提供帮助。否则我会假设两件事:

  • 由于您的手机崩溃,您必须做一些非常棒的事情,这样可以让您的程序在VM分配的内存空间之外运行。
  • 您是否将所有联系人存储在列表或数组中?如果是这样,那就是你的问题。这就是Streams擅长修复的问题。
  • 答案 2 :(得分:1)

    下载是指从远程位置获取数据?看起来你在内存中保存了很多对数据的引用。你一定要吗?根据您要实现的目标,通常可以尝试一些方法来最小化内存占用。首先,我要确保我不使用任何String引用,但我会将数据直接流式传输给使用者。此外,尝试以块的形式处理所有数据。您还需要将数据保存到文件系统吗?如果是这样,直接流到文件系统并避免一起存储。如果您发布一些代码,那可能有所帮助。