等待并发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完成采集需要多少时间。
另外采取内存转储和分析转储使用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。
所以,是的,你应该认真考虑重新使用一些巨大的物体,而不是每次分配它们。这是一个更好的做法,但如果出于某种原因无法做到这一点,则可能会影响堆大小(通过设置大堆),这可能会有所帮助。
有时候,当你有一个永无止境的循环时,只是因为某些条件总是如此。
试着找出它的这种情况是否首先发生,主要是因为这一点。