Android 等待并发GC被阻止
当我在emulator上运行应用程序时,Logcat显示:Android 等待并发GC被阻止,android,eclipse,garbage-collection,Android,Eclipse,Garbage Collection,当我在emulator上运行应用程序时,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/dalvikv
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
这会一直持续到我退出应用程序。有什么建议吗?谢谢这意味着你做了太多的操作,占用了大量内存。因此,正在调用GC(垃圾收集器)以释放内存 4-22 16:21:30.685:D/dalvikvm(967):总重量1545K,20% 自由7019K/8720K,暂停78ms+17ms,总计360ms freed表示释放了多少内存 当堆变得太大而无法防止溢出时,将调用GC_CONCURRENT 暂停78ms+17ms–表示GC完成收集所用的时间
另外,使用MAT工具获取内存转储并分析转储 看起来您正在创建许多新对象,并很快将它们扔掉 要获取WAIT_For_CONCURRENT_GC,请参见以下内容: 这意味着您试图分配内存(例如对象创建),但内存不适合。这就是GC_并发释放的原因。这只是一般的垃圾收集
如果您遇到性能问题,请尝试重用对象或备用对象。大多数人同意@luxer,但我相信这不是因为您分配了太多对象,而是因为您分配了一些大型对象。如果您参考@luxer指向的关于WAIT_FOR_CONCURRENT_GC的链接,您将意识到在您的应用程序中正在触发第二个GC,而并发GC(通常在堆占用率达到软限制时触发)正在进行中。第二个gc可能是由您显式触发的,或者是因为分配失败。由于您没有表示您正在调用System.gc(),因此我假设您的分配失败,并且系统正在尝试执行gc
是的,你应该认真考虑重新使用一些巨大的物体,而不是每次分配它们。这是一种更好的做法,但如果由于某种原因您无法做到这一点,您可能会增加堆大小(通过设置大堆),这可能会有所帮助。有时,当您有一个永无止境的循环时,仅仅因为某些条件总是正确的
试着弄清楚这种情况是否首先发生,因为它的发生主要是因为这个原因。我通过调试代码解决了我的问题:在无限while循环中潜伏着一个DB操作,它正在填充bean,从而导致内存泄漏 如果你是像我这样的新手,请检查while/do-while/for循环和循环中完成的对象分配。 未关闭的连接和游标也应关闭 谢谢