我从dalvikvm获得的GC_FOR_ALLOC太多了。 我从REST服务获取XML:在一个活动中,我以编程方式解析了大约100行(me),而在另一个活动中,我使用SimpleXML来解析大约200行。
在第一个中我得到50个GC_FOR_ALLOC。 在第二个我得到300! (我甚至不能发布所有内容,机身制作29579个字符,而且只允许30k)
我搜索过,几乎每个人都抱怨gc_for_“M”alloc而不是gc_for_“A”lloc。
SimpleXML是否是因为实例创建的问题?
我将发布dalvikvm的logcat转储,也许这些值有一些信息。
非常感谢你的帮助。
12-11 06:13:49.564: D/dalvikvm(6759): GC_FOR_ALLOC freed 362K, 13% free 4116K/4688K, paused 181ms, total 182ms
12-11 06:13:50.074: D/dalvikvm(6759): GC_FOR_ALLOC freed 303K, 13% free 4134K/4708K, paused 142ms, total 142ms
.... repeated many times .....
12-11 06:14:06.254: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% free 4159K/4768K, paused 53ms, total 53ms
12-11 06:14:06.314: D/dalvikvm(6759): GC_FOR_ALLOC freed 103K, 13% free 4159K/4768K, paused 56ms, total 57ms
12-11 06:14:06.374: D/dalvikvm(6759): GC_FOR_ALLOC freed 29K, 12% free 4203K/4768K, paused 54ms, total 54ms
12-11 06:14:06.424: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% fre
答案 0 :(得分:10)
您可以使用DDMS分配跟踪器(memory debugging docs,旧blog post,ddms docs)查看最近分配的对象。这将显示正在分配的内容,并为执行分配的位置提供堆栈跟踪。
Another blog post描述了MAT和其他相关工具,虽然堆转储分析对于这类问题不太有用,因为它通常会向您显示尚未被释放的对象,以及你对 被释放的对象更感兴趣。
答案 1 :(得分:6)
在Android Dalvik VM中,当dlmalloc足迹空间不足以支持新版或GC_FOR_ALLOC
时,{strong}对象分配步骤中的heap->bytesAllocated + n > hs->softLimit
会被置入。您可以将dalvik.system.setTargetHeapUtilization
设置为更低,以获得更多可用堆空间。
答案 2 :(得分:2)
你可以使用MAT MAT tutorial
查找创建和垃圾收集的对象数量。以便您可以优化代码
答案 3 :(得分:2)
如果在应用程序滞后时获得多个GC_FOR_ALLOC
,则错误很可能在循环中。检查代码行开始触发GC的位置,然后从那里开始跟踪代码。根据我的经验,我错误地输入了我的内部循环迭代器,导致程序进行无限循环。我创建了一个这样的bug:
for(int i=0; i<list.size(); i++) {
for(int j=i+1 j<list.size(); i++) {
// I mistyped the iterator of integer j with i
// making an infinite loop which triggered the GC.
//appears many times
}
}
答案 4 :(得分:1)
我今天遇到同样的问题。 我在我的代码中找到了一个未结束的循环,例如while(i&lt; xx),但我没有在while体中实现i ++语句。 所以你遇到的消息就出现了。 请先检查您的代码。
答案 5 :(得分:0)
我的日志:
D/dalvikvm: GC_FOR_ALLOC freed 549K, 9% free 7878K/8596K, paused 30ms, total 34ms
...freed 539K, 9% free 7888K/8596K, paused 30ms, total 30ms
...freed 1856K, 21% free 8083K/10108K, paused 51ms, total 51ms
...freed 582K, 9% free 7845K/8596K, paused 38ms, total 38ms
说明:
当你的应用获得每个应用的内存更多限制。 Dalvik / Ant呼叫垃圾收集器。
限制内存的应用决定了Dalvik / Ant。正如你所看到的那样,Dalvik决定8596K(双案)和8083K(一案)。
并限制运行时间的变化。
你不能确定这种情况何时发生。但是你可以减少这种可能性。减少应用程序消耗的内存量。
PS:决定何时召唤GC打败Dalvik / Ant。你不能确定这种情况何时发生。但是你可以减少这种可能性。减少应用程序消耗的内存量。
PS:在“监视器安卓”中,参见“监视器”选项卡,图形“内存”。并使用按钮:“暂停(启用)”,启动GC,“转储Java堆”“启动分配跟踪(非常有用)”。并使用官方指南:
据我所知,当VM调用GC 时,App不得停止/暂停工作或崩溃。