Android错误:HeapWorker被楔入... BinderInternal $ GcWatcher

时间:2010-08-17 22:09:15

标签: android

我的Android应用程序崩溃,出现以下错误:

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

所以看起来GCWatcher正在采取> 10s完成。

当AsyncTask通过http从远程服务器检索/传递数据时,会发生这种情况。它并不总是抛出这个错误,而且它最近才开始发生......以前这个工作正常并且应用程序代码没有变化。

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

1 个答案:

答案 0 :(得分:4)

GcWatcher的东西有点像黑客。它试图解决的问题是,一个进程中的资源可以阻止另一个进程中的资源释放,并且资源只能由VM的垃圾收集器释放。系统希望定期强制垃圾收集,以防止在很少GC的安静过程中积累,因此它会尝试通过创建可终结对象并在终结器运行时记录最后一次GC的发生。

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

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

您应该在logcat中拥有完整的堆栈跟踪。看看其他线程在哪里。你可能还想运行像“top”这样的程序来查看你最近安装的东西是否吸收了所有的CPU并加剧了这种情况。

您运行的是什么版本的Android?线程优先级内容随每个版本而变化(最近使用“cgroup”机制)。