等待阻塞并发GC(Wait for concurrent GC blocked)

2019-08-31 19:28发布

当我在模拟器上运行我的应用程序的logcat将显示有关信息:

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建议?谢谢

Answer 1:

好像你已经创造了许多新对象,并很快扔掉。

对于WAIT_FOR_CONCURRENT_GC看到这一个: 是什么WAIT_FOR_CONCURRENT_GC阻塞是什么意思?

这意味着你尝试分配内存(例如对象的创建),它不适合到内存中。 那是什么释放被GC_CONCURRENT所致。 它只是平常的垃圾收集。

如果你有性能问题,尝试重用对象或放过他们。



Answer 2:

这意味着你做了太多的操作和正在使用大量的内存。 因此,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工具。



Answer 3:

同意大多与@luxer,但我相信这并不是说你分配过多的对象,但你分配一些巨大的对象。 如果你指的是由约WAIT_FOR_CONCURRENT_GC @luxer指向的链接,你会发现,第二个GC被触发在你的应用程序,而并发GC(当堆占用打软限制这通常是触发)正在进行中。 第二GC可能由您或明或因为分配失败被触发。 既然你没有表明你调用System.gc(),我会假设你的分配是失败,系统试图做一个GC。

所以,是的,你应该认真考虑重新使用一些巨大的对象,而不是每次分配他们。 这是一个更好的做法,但如果由于某种原因,你无法做到这一点,你可能碰到堆大小(通过设置大型堆),以及可能的帮助。



Answer 4:

有时候,当你有一个永无止境的循环,只是因为一些条件始终为真会发生。

首先尝试如果弄清楚这种情况下,它的发生主要是因为这个原因。



Answer 5:

我能够调试我的代码来解决我的:有一个DB操作潜伏在一个无限while循环,这就是给豆,从而导致内存泄漏。

也许,如果找你像我一样AA新手,请在同时/ DO-而/ for循环和对象循环中完成分配。 未关闭的连接和光标也应该关闭。

谢谢,



文章来源: Wait for concurrent GC blocked