最近碰着了java.lang.OutOfMemoryError: unable to create new native thread,籍由这个机会尝试深入理解这个问题。
原因是创建过多thread引出的问题,JVM此时无法再创建出更多的线程。
这里的解释还是比较靠谱的
引用
As you can see, the maximum number of threads I can create decreases as the heap size gets larger. This is because the JVM immediately reserves the address space specified for the maximum heap size - That's probably because it needs that memory to be contiguous
.
表象便是当JVM的heap size设置过大时,thread的创建数量便会减少。
这里找到了一个还算清晰的说明
引用
Maximum heap size depends on maximum address space per process.
Maximum heap space is always smaller than maximum address space per process, because the process also needs space for stack, libraries, and so on.
JVM的堆和进程所需的栈都会消耗进程地址空间(address space),而地址空间则取决于操作系统,Windows中
引用
所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于 Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB 为操作系统保留(也称为内核模式地址空间)。
目前我的理解是,JVM申请的heap会占用相同大小的地址空间(address space)。在Windows 32位操作系统中,分配给每个程序的地址空间只有2GB(当然也有3GB的开关)。而每个不同的JVM的堆和其创建的进程栈都依赖于同一个进程地址空间,所以这也是
此消彼长的原因。
有方法可以提高创建线程的数量:
1.减少JVM的heap size;
2.减少单个线程栈的大小,在JVM启动中使用-Xss参数。目前JDK1.4中每个线程栈所大小是256K,1.5是1M.
唉,大学的操作系统课程荒废了,地址空间也有些拎不清了。
分享到:
相关推荐
【Java虚拟机内存溢出分析】:当遇到`java.lang.OutOfMemoryError: unable to create new native thread`错误时,这通常表示系统无法为新的Java线程分配足够的内存,即操作系统层面的资源耗尽,而非Java堆内存不足。...
5. 无法创建新的原生线程(Unable to create new native thread) 当JVM尝试创建新的线程时,如果无法获取足够的原生内存来分配新线程的栈空间,就会抛出该错误。通常发生在系统限制了线程数量或是原生内存不足时。 ...
3. **无法创建新的本地线程 (Unable to create new native thread)**: - 每个Java应用在操作系统上都表现为一个或多个线程。当JVM尝试创建新线程但操作系统报告无可用资源时,会抛出此错误。 - 这可能是由于系统...
- **错误日志**:`java.lang.OutOfMemoryError: unable to create new native thread` 和 `java.lang.OutOfMemoryError: request bytes for ... Out of swap space?` - **原因**:可能由于Java堆设置过大导致...
4. OutOfMemoryError: unable to create new native thread:无法创建新 native 线程。 解决方案: * 通过 -XX:MaxMetaspaceSize=512m 等 JVM 参数调整 Metaspace 的大小。 * 优化代码,减少对象的创建和销毁,...
JBeret是。 它还包含在在Java EE环境中提供可移植批处理支持。...并可能在某些计算机上引起内存错误: OutOfMemoryError: unable to create new native thread增加ulimit以避免此类错误。 例如, uli
在使用Dubbo进行分布式服务调用的过程中,可能会遇到“无法创建新线程”的异常情况,具体表现为`java.lang.OutOfMemoryError: unable to create new native thread`。此类异常通常出现在系统资源紧张的情况下,特别...
OutOfMemoryError的8种经典案例,Java heap space、GC overhead limit exceeded、Permgen space、Metaspace、Unable to create new native thread、Out of swap space?、Requested array size exceeds VM limit、...
系统会提示出错,前台错误为:HTTP Status 500-Dispatch[EAITool] to method listCurTree retrun an exception,后台错误为:java.lang.OutOfMemoryError: unable to create new native thread。 解决方法: 为了...
【情况五】:`java.lang.OutOfMemoryError: unable to create new native thread` 这表明系统无法创建新的原生线程,可能是由于线程栈空间不足或者系统资源限制。解决方法包括减少单个线程栈大小(使用`-Xss`参数)...
3. OutOfMemoryError: unable to create new native thread 这种情况发生在JVM无法创建新的操作系统线程时,通常与系统资源的限制有关,包括JVM的线程栈大小和操作系统的线程限制。解决方法可能涉及调整JVM的线程栈...
第三种OutOfMemoryError:unable to create new native thread 这种错误在Java线程个数很多的情况下容易发生,发生原意和解决办法可以参见相关文档。 OutOfMemoryError是Java开发中的一种常见错误,了解JVM的内存...
java.lang.OutOfMemoryError: unable to create new native thread ``` 或是在启动服务时收到: ``` /etc/profile: fork: retry: Resource temporarily unavailable ``` 这些错误通常表明系统中的线程资源已经...
3. **OutOfMemoryError: unable to create new native thread**: 当操作系统无法为新线程分配足够的内存时,会出现此错误。这可能是由于操作系统的线程限制或者JVM的线程堆栈大小设置不当。调整操作系统参数和 `-Xss...