等待并发GC阻塞

问题描述:

当我在模拟器上运行我的应用程序的logcat将显示有关信息:等待并发GC阻塞

04-22 16:21:30.685: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+17ms, total 360ms 

04-22 16:21:30.685: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 143ms 
04-22 16:21:31.845: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 116ms+18ms, total 554ms 

04-22 16:21:31.845: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 268ms 
04-22 16:21:32.435: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 75ms+9ms, total 192ms 

04-22 16:21:32.435: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 73ms 
04-22 16:21:32.945: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 75ms+10ms, total 209ms 

04-22 16:21:32.945: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 70ms 
04-22 16:21:33.434: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+12ms, total 192ms 

,这样下去,直到我退出application.Any建议感谢

这意味着你在做什么?太多的操作和大量的内存正在被使用。因此,GC(垃圾回收器)正在被调用以释放内存。

04-22 16:21:30.685:d/dalvikvm(967):GC_CONCURRENT释放1545K,20% 免费7019K/8720K,暂停78ms + 17MS,总360ms

释放指示如何释放大量内存

GC_CONCURRENT当堆变得太大以防止溢出时调用。

暂停78ms + 17ms - 指示GC完成采集需要多少时间。

Refer

另外采取内存转储和分析转储使用MAT工具。

好像你正在创造许多新的物体并很快将它们扔掉。

对于WAIT_FOR_CONCURRENT_GC看到这一个: what does WAIT_FOR_CONCURRENT_GC blocked mean?

这意味着你尝试分配内存(例如对象的创建),它不适合到内存中。这就是GC_CONCURRENT释放的原因。它只是通常的垃圾收集。

如果您遇到性能问题,请尝试重新使用对象或将其备用。

主要同意@luxer,但我相信这不是你分配的对象太多,而是你正在分配一些巨大的对象。如果您引用了由@luxer指向的关于WAIT_FOR_CONCURRENT_GC的链接,您将会意识到在应用程序中触发了第二个gc,而并发gc(通常在堆占用达到软限制时触发)正在进行中。第二个gc可能是由您明确触发的,或者是因为分配失败。既然你没有表明你在调用System.gc(),我会认为你的分配失败了,系统正在尝试做一个gc。

所以,是的,你应该认真考虑重新使用一些巨大的物体,而不是每次分配它们。这是一个更好的做法,但如果出于某种原因无法做到这一点,则可能会影响堆大小(通过设置大堆),这可能会有所帮助。

有时候,当你有一个永无止境的循环时,只是因为某些条件总是如此。

试着找出它的这种情况是否首先发生,主要是因为这一点。