Android dalvikvm-heap:Clamp target GC heap

Man*_*hot 22 java android garbage-collection memory-leaks memory-management

我正在编写一个程序来与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
Run Code Online (Sandbox Code Playgroud)

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

Log.e("Memory", "free mem =" +runtime.freeMemory());
Log.e("Memory", "total memory =" +runtime.totalMemory());
Run Code Online (Sandbox Code Playgroud)

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

---------------------------------------------------------------
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

---------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

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

sla*_*ton 8

虽然这不是最佳答案,但我强烈建议您在Google IO 2011上观看Android应用内存管理视频.它可以很好地解释如何管理内存以及您看到的消息实际意味着什么.