我的Android应用崩溃了,并显示以下错误:

ERROR/dalvikvm(7051): HeapWorker is wedged: 10037ms spent inside Lcom/android/internal/os/BinderInternal$GcWatcher;.finalize()V

因此,看来GCWatcher需要10秒钟以上才能完成。

这是在AsyncTask通过http从远程服务器检索/传递数据时发生的。它并不总是抛出此错误,它只是在最近才开始发生...以前,它一直运行良好,并且应用程序代码未更改。

任何人都知道导致此错误的原因以及如何阻止该错误?

最佳答案

GcWatcher的东西有点骇人听闻。它试图解决的问题是,一个进程中的资源可以阻止另一进程中的资源释放,而这些资源仅由VM的垃圾收集器释放。该系统希望定期强制垃圾回收,以防止事情在GC很少的安静进程中建立,因此它试图通过创建可终结对象并记录终结器何时运行来跟踪上次GC发生的时间。

GcWatcher.finalize方法非常简单。如果要花10秒钟才能运行,那是因为该线程被系统的其余部分饿死了。通常发生的是该进程中的其他一些低优先级线程正在尝试进行分配,但由于CPU不想再给它更多时间而最终陷入停滞。当GcWatcher.finalize尝试创建新的可终结对象时,(正常优先级)HeapWorker线程被卡住。 (请参阅“优先级倒置”)

在安静的系统上,这应该不会发生,因为每个线程应该有足够的时间来完成一些工作。

您应该在logcat中有完整的堆栈跟踪。查看其他线程在哪里。您可能还需要运行“top”之类的程序,以查看您最近安装的某些东西是否占用了所有CPU并加剧了这种情况。

您正在运行什么版本的Android?每个版本的线程优先级都发生了变化(最近使用“cgroup”机制)。

关于Android错误: HeapWorker is wedged. .. BinderInternal $ GcWatcher,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3507372/

10-10 16:08