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

The*_*One 5 android

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

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

所以看起来GCWatcher要花费大于10秒来完成.

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

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

fad*_*den 4

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

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

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

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

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