Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android dalvikvm堆:钳制目标GC堆_Java_Android_Memory Management_Memory Leaks_Garbage Collection - Fatal编程技术网

Java Android dalvikvm堆:钳制目标GC堆

Java Android dalvikvm堆:钳制目标GC堆,java,android,memory-management,memory-leaks,garbage-collection,Java,Android,Memory Management,Memory Leaks,Garbage Collection,我正在编写一个程序,将大量联系人与Android联系人数据库同步。下载大约700个联系人都可以正常工作,之后我一直收到一个内存堆错误,它调用无限多个GC语句,并最终重新启动手机。我面临着HTC欲望的问题 我使用DDMS中的heap alocation工具检查了应用程序的堆大小,并使用Debug.dumpHprofData提取了hprof文件。两个日志都表明堆大小约为2.4MB 但是,我得到以下日志,这表明堆大小大于32.MB dalvikvm-heap(92): Clamp target GC

我正在编写一个程序,将大量联系人与Android联系人数据库同步。下载大约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,所以请对我放松点:)……

虽然这不是最好的答案,但我强烈建议你观看Google IO 2011上的视频演讲。它很好地解释了如何管理内存以及您看到的消息的实际含义。

您需要将代码发布给任何人以提供帮助。否则,我假设两件事:
  • 因为你的手机正在崩溃,你必须做一些很棒的事情,让你的程序在虚拟机分配的内存空间之外运行

  • 您是否将所有联系人存储在列表或数组中?如果是这样,那就是你的问题了。这就是Streams擅长解决的问题
  • 下载是指从远程位置获取数据?看起来您在内存中保留了很多对数据的引用。你一定要吗?根据您试图实现的目标,通常有一些事情可以尝试最小化内存占用。首先,我要确保不使用任何字符串引用,但我要将数据直接流式传输给消费者。此外,尝试将所有数据分块处理。您还需要将数据持久化到文件系统吗?如果是这样,则直接流式传输到文件系统,同时避免内存存储。如果您发布一些代码,这可能会有所帮助。

    您可以链接或粘贴相关的源代码吗?查看一些代码会有所帮助。不管怎样-为什么需要将所有联系人存储在内存中?通常在同步联系人时,设置光标并批量查询。您可能不需要同时保存内存中的所有联系人。我遗漏了什么吗?日志中dalvikvm行的进程id是您的进程吗?您找到任何解决方案/解释了吗?如果您可以共享,这将非常有用。将目标GC堆从33.999MB钳制到32.000MB是什么意思