`
bluepopopo
  • 浏览: 92341 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

理解OutOfMemoryError: unable to create new native thread

    博客分类:
  • J2SE
阅读更多
最近碰着了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.

唉,大学的操作系统课程荒废了,地址空间也有些拎不清了。
分享到:
评论
1 楼 yumeyume 2009-11-02  

thanks for sharing

这个应该是Windows的限制

http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_heap_32bit

Why can't I get a larger heap with the 32-bit JVM?

The maximum theoretical heap limit for the 32-bit JVM is 4G. Due to various additional constraints such as available swap, kernel address space usage, memory fragmentation, and VM overhead, in practice the limit can be much lower. On most modern 32-bit Windows systems the maximum heap size will range from 1.4G to 1.6G. On 32-bit Solaris kernels the address space is limited to 2G. On 64-bit operating systems running the 32-bit VM, the max heap size can be higher, approaching 4G on many Solaris systems.

As of Java SE 6, the Windows /3GB boot.ini feature is not supported.

JVM占用的内存包括Stack, Heap等。但是只有Heap是可以设置的。如果windows只能给每个应用程序分配2G内存,那么heap也不能使用全部,Stack要占用一部分。Solaris就没有这个问题。

相关推荐

    问题分析:java.lang.OutOfMemoryError unable to create new native thre

    【Java虚拟机内存溢出分析】:当遇到`java.lang.OutOfMemoryError: unable to create new native thread`错误时,这通常表示系统无法为新的Java线程分配足够的内存,即操作系统层面的资源耗尽,而非Java堆内存不足。...

    OutOfMemoryError_8种典型案例分享

    5. 无法创建新的原生线程(Unable to create new native thread) 当JVM尝试创建新的线程时,如果无法获取足够的原生内存来分配新线程的栈空间,就会抛出该错误。通常发生在系统限制了线程数量或是原生内存不足时。 ...

    内存不足OOM java.lang.OutOfMemoryError.

    3. **无法创建新的本地线程 (Unable to create new native thread)**: - 每个Java应用在操作系统上都表现为一个或多个线程。当JVM尝试创建新线程但操作系统报告无可用资源时,会抛出此错误。 - 这可能是由于系统...

    java内存溢出原因

    - **错误日志**:`java.lang.OutOfMemoryError: unable to create new native thread` 和 `java.lang.OutOfMemoryError: request bytes for ... Out of swap space?` - **原因**:可能由于Java堆设置过大导致...

    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx

    4. OutOfMemoryError: unable to create new native thread:无法创建新 native 线程。 解决方案: * 通过 -XX:MaxMetaspaceSize=512m 等 JVM 参数调整 Metaspace 的大小。 * 优化代码,减少对象的创建和销毁,...

    jsr352:实施JSR 352

    JBeret是。 它还包含在在Java EE环境中提供可移植批处理支持。...并可能在某些计算机上引起内存错误: OutOfMemoryError: unable to create new native thread增加ulimit以避免此类错误。 例如, uli

    Dubbo无法创建新线程异常解决方案.docx

    在使用Dubbo进行分布式服务调用的过程中,可能会遇到“无法创建新线程”的异常情况,具体表现为`java.lang.OutOfMemoryError: unable to create new native thread`。此类异常通常出现在系统资源紧张的情况下,特别...

    OutOfMemoryError Handbook

    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、...

    TOMCAT内存溢出之解决方法

    系统会提示出错,前台错误为:HTTP Status 500-Dispatch[EAITool] to method listCurTree retrun an exception,后台错误为:java.lang.OutOfMemoryError: unable to create new native thread。 解决方法: 为了...

    关于java堆内存溢出的几种情况

    【情况五】:`java.lang.OutOfMemoryError: unable to create new native thread` 这表明系统无法创建新的原生线程,可能是由于线程栈空间不足或者系统资源限制。解决方法包括减少单个线程栈大小(使用`-Xss`参数)...

    tomcat内存溢出总结(2013年)

    3. OutOfMemoryError: unable to create new native thread 这种情况发生在JVM无法创建新的操作系统线程时,通常与系统资源的限制有关,包括JVM的线程栈大小和操作系统的线程限制。解决方法可能涉及调整JVM的线程栈...

    JAVA内存溢出

    第三种OutOfMemoryError:unable to create new native thread 这种错误在Java线程个数很多的情况下容易发生,发生原意和解决办法可以参见相关文档。 OutOfMemoryError是Java开发中的一种常见错误,了解JVM的内存...

    linux 测试环境线程问题解决

    java.lang.OutOfMemoryError: unable to create new native thread ``` 或是在启动服务时收到: ``` /etc/profile: fork: retry: Resource temporarily unavailable ``` 这些错误通常表明系统中的线程资源已经...

    apache服务器出现内存溢出的解决方法.doc

    3. **OutOfMemoryError: unable to create new native thread**: 当操作系统无法为新线程分配足够的内存时,会出现此错误。这可能是由于操作系统的线程限制或者JVM的线程堆栈大小设置不当。调整操作系统参数和 `-Xss...

Global site tag (gtag.js) - Google Analytics