- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 Android 应用因以下错误而崩溃:
ERROR/dalvikvm(7051): HeapWorker is wedged: 10037ms spent inside Lcom/android/internal/os/BinderInternal$GcWatcher;.finalize()V
所以看起来 GCWatcher
需要超过 10 秒才能完成。
这发生在 AsyncTask 通过 http 从远程服务器检索/传递数据时。它并不总是会抛出此错误,它只是最近才开始发生......以前它一直运行良好并且应用程序代码未更改。
任何人都知道是什么导致了这个错误,我该如何阻止它?
最佳答案
GcWatcher 的东西有点像 hack。它试图解决的问题是一个进程中的资源可以阻止另一个进程中的资源释放,而这些资源只能由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/
我的 Android 应用因以下错误而崩溃: ERROR/dalvikvm(7051): HeapWorker is wedged: 10037ms spent inside Lcom/android
我是一名优秀的程序员,十分优秀!