【问题标题】:Wait for concurrent GC blocked等待并发 GC 阻塞
【发布时间】:2013-04-22 16:28:23
【问题描述】:

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

这会一直持续到我退出应用程序。有什么建议吗?谢谢

【问题讨论】:

    标签: android eclipse garbage-collection


    【解决方案1】:

    似乎您正在创建许多新对象并很快将它们丢弃。

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

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

    如果您遇到性能问题,请尝试重用对象或保留它们。

    【讨论】:

      【解决方案2】:

      这意味着您正在执行太多操作并且正在使用大量内存。因此,正在调用 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 完成收集所用的时间。

      Refer

      另外取内存dump,使用MAT工具分析dump。

      【讨论】:

        【解决方案3】:

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

        所以,是的,您应该认真考虑重用一些巨大的对象,而不是每次都分配它们。这是一种更好的做法,但如果由于某种原因您无法做到这一点,您可能会增加堆大小(通过设置大堆),这可能会有所帮助。

        【讨论】:

          【解决方案4】:

          有时,当您有一个永无止境的循环时会发生这种情况,只是因为某些条件始终为真。

          首先尝试弄清楚它是否是这种情况,因为它主要是因为这个而发生的。

          【讨论】:

            【解决方案5】:

            我能够通过调试我的代码来解决我的问题:有一个 DB 操作潜伏在一个无限的 while 循环中,它正在填充 bean 并因此导致内存泄漏。

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

            谢谢,

            【讨论】:

              猜你喜欢
              • 2021-09-14
              • 1970-01-01
              • 2020-09-21
              • 2022-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多