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

前端之家收集整理的这篇文章主要介绍了Android错误:HeapWorker被楔入… BinderInternal $GcWatcher前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

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

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

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

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

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

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

猜你在找的Android相关文章