等待并发GC被阻塞

17

当我在模拟器上运行我的应用程序时,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

直到我退出应用程序,这个过程会持续下去。有什么建议吗?谢谢。

5个回答

8
看起来你正在创建许多新对象并很快就将它们丢弃。WAIT_FOR_CONCURRENT_GC则是指尝试分配内存(例如创建对象),但无法适应内存。这正是GC_CONCURRENT freed的原因,这只是普通的垃圾收集。如果你遇到性能问题,请尝试重用对象或节约使用它们。有关WAIT_FOR_CONCURRENT_GC的详细信息,请参见此链接:what does WAIT_FOR_CONCURRENT_GC blocked mean?

5

这意味着您正在执行太多的操作,使用了大量内存。因此,GC(垃圾回收器)被调用以释放内存。

04-22 16:21:30.685: D/dalvikvm(967): GC_CONCURRENT 已释放1545K内存,剩余20%可用,总共7019K/8720K,暂停时间为78ms+17ms,共计360ms

“freed”表示释放了多少内存。

“GC_CONCURRENT”是在堆变得过大以防止溢出时调用的。

“paused 78ms+17ms”表示GC完成收集所需的时间。

参考链接

另外,需要获取内存转储,并使用MAT工具分析该转储。


2
我基本上同意@luxer的观点,但我认为问题不在于您分配了太多对象,而是您分配了一些巨大的对象。如果您参考@luxer提供的关于WAIT_FOR_CONCURRENT_GC的链接,您将意识到在进行并发gc(通常在堆占用达到软限制时触发)时,您的应用程序会触发第二次gc。第二次gc可能是由您明确触发的,也可能是由于分配失败而触发的。由于您没有指示您正在调用System.gc(),因此我会假设您的分配失败,并且系统正在尝试进行gc。
所以,是的,您应该认真考虑重复使用某些巨大的对象,而不是每次都分配它们。这是一种更好的做法,但如果由于某种原因您无法这样做,您可以通过设置大堆大小来增加堆大小,这可能有所帮助。

2

有时候,由于某个条件始终为真,你会陷入一个永无止境的循环。

首先要确定是否是这种情况,因为大多数情况下都是这个原因导致的。


0

我通过调试代码解决了我的问题:在一个无限循环中潜伏着一个数据库操作,它填充了bean,从而导致内存泄漏。

如果你像我一样是新手,请检查while/do-while/for循环和循环中的对象分配。未关闭的连接和游标也应该被关闭。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接