当前位置: 首页 > 面试题库 >

golang运行时:无法创建新的OS线程(已经有2049; errno = 12)

宋斌
2023-03-14
问题内容

我在MacO上创建了许多goroutine,并且在执行程序时发出错误。

goRoutineId = 3710, i = 3683, len(chan) = 2049
runtime: failed to create new OS thread (have 2049 already; errno=12)
fatal error: runtime.newosproc

因此,我想知道“无法创建新的OS线程”是什么,就是golang的操作系统限制无法创建更多goroutine?感谢你们对我的帮助。


问题答案:

这是操作系统的限制。我假设您正在使用linux。

根据go的来源,它是调用clone系统调用

ret := clone(cloneFlags, stk, unsafe.Pointer(mp), unsafe.Pointer(mp.g0), unsafe.Pointer(funcPC(mstart)))
sigprocmask(_SIG_SETMASK, &oset, nil)

if ret < 0 {
    print("runtime: failed to create new OS thread (have ", mcount(), " already; errno=", -ret, ")\n")
    if ret == -_EAGAIN {
        println("runtime: may need to increase max user processes (ulimit -u)")
    }
    throw("newosproc")
}

从clone(2)的联机帮助页中,当时errno=12,错误原因是内存不足

ENOMEM Cannot allocate sufficient memory to allocate a task structure
              for the child, or to copy those parts of the caller's context
              that need to be copied.


 类似资料:
  • 问题内容: 我看到这样的评论 我见过这个问题的一个地方是,如果您继续创建线程,而不是直接在线程对象上调用run(),而不是调用start()。这将导致线程对象不被取消引用…因此,一段时间后,出现无法创建新本机线程的消息 在Sun Java论坛上 在我的应用程序中,最初我们计划使用线程,但是后来,我们决定不再需要线程,因此我们只调用run()而不是start()。我们是否需要为新的threadCla

  • 在大约1024个线程之后,我们在jboss上得到了“java.lang.OutofMemoryError:无法创建新的本机线程”,因为应用程序消耗了最大的用户进程 你能帮我弄清楚代码哪里不对吗?在service.shutdown()之后,我应该添加tasks.clear()还是tasks.remove(ctgService)? 谢谢。

  • 我试图在(1and1VPS)上运行服务器。就在服务器启动和客户机的几个请求(重新加载网页)之后,我得到了这个错误: 但是当我在计算机上运行时,一切都正常。我使用和Centos5.8新安装制作了自己的虚拟服务器,它也在那里工作。 这个内存不足错误的原因可能是什么?如果你有任何建议,请分享。我不知道该怎么处理这个了。

  • 我使用netbans 10.0创建了一个新的CodeNameOne项目,但我无法运行它 输出: /home/autonome/NetBeansProjects/javaWorkSpace/CodenameOne7/build。xml:17:taskdef类com所需的类。代号1。建筑客户找不到GenerateGuiSources:javax/xml/bind/JAXBException,使用类加载