macos - 一致调度队列 : com. apple.root.default-qos.overcommit 崩溃

标签 macos cocoa crash

有人有诊断这些崩溃的经验吗?我有一个用户始终如一地获得它们,尽管我找到了一篇与 iOS 相关的帖子,但我的应用程序在相同类型的操作上并没有崩溃...

最佳答案

原因:

在iOS/tvOS中有队列/线程,每个线程都有自己的类型或优先级,也称为“服务质量”或简称“QOS”,这意味着CPU应该处理该线程的紧急程度,可能性是:

  • QOS_CLASS_DEFAULT
  • QOS_CLASS_USER_INITIATED
  • QOS_CLASS_UTILITY
  • QOS_CLASS_BACKGROUND
  • QOS_CLASS_UNSPECIFIED
  • QOS_CLASS_USER_INTERACTIVE

一旦您在同一个队列中同时运行太多任务,操作系统就会通知您它无法以相同的优先级同时执行所有这些任务(堆栈的大小有限制)每个队列),那里写着“OverCommit”,这意味着您已经过度提交了队列(在您的情况下是“Default-QOS”队列)并且它退出,因为它此时无法接收更多任务并以时尚方式执行它们你想要的。

解决方案:

您应该做的是首先找到导致此崩溃的“dispatch_async”命令,然后使用其他队列之一(这意味着预计响应速度会比该任务预期的响应速度慢),

通常开发人员不会考虑它,只是使用主队列,这是默认的优先级/队列,如下所示:

dispatch_async(dispatch_get_main_queue()) {
    // some task to perform
    print("This is my task")
}

为了解决此问题(如果应用程序通知您已过度使用主队列),请将其更改为其他队列之一,如下所示:

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    // some task to perform
    print("This is my task")
})

如果您不需要后台(或并行)执行,您甚至可以完全忽略dispatch_async命令并简单地执行如下命令:

// some task to perform
print("This is my task")

关于macos - 一致调度队列 : com. apple.root.default-qos.overcommit 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27948618/

相关文章:

objective-c - 是否有任何函数可以检索与 inode 关联的路径?

linux - 如何处理lua中的这种内存泄漏?

linux - 为什么 org-preview-latex-fragment 在 OSX 中的工作速度比在 Linux 中慢 10 倍?

c++ - ___sincos_stret 链接时 undefined symbol

objective-c - COCOA 中的 JSON(使用 YAJL)

objective-c - Cocoa 绑定(bind)不从用户默认值中读取 nil 值

ios - 将字节附加到 NSInputStream 以便稍后顺序读取

c++ - vfork导致内存 "free()"崩溃,但是fork却没有,这是怎么回事?

iphone - 崩溃我的应用程序

ruby-on-rails - Heroku "We' 很抱歉,但在 Postgres 迁移后出了点问题