【问题标题】:Openshift - java.lang.OutOfMemoryError: unable to create new native thread"Openshift - java.lang.OutOfMemoryError:无法创建新的本机线程”
【发布时间】:2015-05-07 05:38:46
【问题描述】:
我在 Openshift PAAS 上托管了我的应用程序。我的应用程序没有明确创建线程。我一直收到以下错误
m.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
严重: MappableContainerException 中包含的异常无法映射到响应,重新抛出到 HTTP 容器
java.lang.OutOfMemoryError: 无法创建新的本地线程
我该如何解决这个错误?我使用托管服务器时无权更改 ulimit。
【问题讨论】:
标签:
threadpool
native
openshift
【解决方案1】:
通常,当 JVM 向操作系统请求新线程时,您会遇到“java.lang.OutOfMemoryError: Unable to create new native thread”。每当底层操作系统无法分配新的本地线程时,就会抛出这个 OutOfMemoryError。本机线程的确切限制取决于平台。
但总的来说,导致 java.lang.OutOfMemoryError: Unable to create new native thread 的情况会经历以下几个阶段:
- 在 JVM 中运行的应用程序请求一个新的 Java 线程
- JVM 本机代码向操作系统代理创建新本机线程的请求
- 操作系统尝试创建一个新的本机线程,该线程需要为线程分配内存
- 操作系统将拒绝本机内存分配,因为 32 位 Java 进程大小已耗尽其内存地址空间,例如(2-4) 已达到GB进程大小限制或操作系统的虚拟内存已完全耗尽
- 抛出 java.lang.OutOfMemoryError: Unable to create new native thread 错误。
通常情况下,OutOfMemoryError 对新本机线程的限制表明存在编程错误。当您的应用程序产生数千个线程时,很可能出现了严重错误 - 没有多少应用程序可以从如此大量的线程中受益