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

[JVM]-OutOfMemoryError: unable to create new native thread

阅读更多
近来在系统的运行过程中碰到了一位老朋友,它正是大家所熟悉的OutOfMemory*,不过跟以前那位不太一样,它托着一个Error的尾巴,另外则是系统在抛出该例外时,并没有退出JVM实例。

那么这位改头换面的朋友究竟是何许人也,Google了一下居然也有一大片的介绍,甚至有些Blog已经探索到JVM寻址技术。这里赞一下,很好很强大,但如同我老大所说,精确到这层面,那么我们所能做的优化工作还剩多少?

Okay,看一下JDK的specification中对OutOfMemoryError 的描述:
Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.
Umm, 这意思是在说由于没有更多的可用内存给GC或内存已经溢出,导致JVM无法分配新的对象,所以抛出OutOfMemoryError。我觉得这似乎在说Heap的内存溢出, 然而OutOfMemoryError完全是Stack中无法启动线程而抛出的异常。(大伙觉得java对outofmemoryerror的描述有没有问题?
看了这段简单的描述,我立马想到了JVM 的Xmx参数,难道由于Heap size 太小, 导致无法新生对象?

事实上,我的Heap Size 设置为2047M, 系统的日志记录着在OutOfMemory时, 已使用内存才300+M, 问题越来越离奇,难道是内存泄露么。为此,我通过Linux的pmap查到系统进程中,每个对象地址的使用内存大小, 以及通过jmap查看JVM的Heap 中对象的内存占用情况,都表明内存占用很正常。最后只能无功而返.

继续Google, 看到Sun的一个论坛里也有人提到:
http://forums.sun.com/thread.jspa?threadID=605782&messageID=3360044
贴子里一个叫unsavory的人,他的解决方案是Threadpool, 意思是我们在生成销毁线程时,部分内存未被回收。最终导致了溢出,当然sun还有其他贴子说的更加离谱,说是在我们的项目中使用了RMI对象导致内存溢出。(摊手, 浪费了我不少时间.

事实上, 回到主题, 该异常由栈中抛出, 表明栈中无可用内存来服务线程。而JVM的内存大致可分为(这里不够严谨)内存数据区(包括Stack)+对象堆区,由于JVM实例进程寻址是一定的。所以两者此消彼涨的关系,对于32位的机子, JVM整个实例可用内存不到3G,加上我的Heap Size 设置了2G,留给数据区只有1G不到,  当时系统跑了大概500+的线程, 按照JDK1.5以来, 每个线程栈的大小为1M, 这样算出溢出就差不多了. 解决方案是减小Heap Size 的大小给数据区留下内存, 或是增加CPU位数。
分享到:
评论
8 楼 david.org 2010-03-22  
嗯, 确实有很大的帮助, 先谢过再阅读  
7 楼 freesky110 2010-03-21  
下面的文章对java的OOM进行了揭秘,或许对你有所帮助:http://java.sys-con.com/node/1229281
6 楼 david.org 2010-03-21  
sdh5724 写道
* 调整java thread stack:  -Xss256k   需要测试下, 基本来说是足够的. 能降低jvm内存的使用。
* 32位下, 最好不要超过1280M内存。
* 看看  ulimit -u 这个参数. 这是表示用户能拥有的线程数量。 还有OS能拥有的线程也是有限制的: thread-max
* 内存对线程数量的影响不是直接的。
* 线程栈的最大数值, 不影响线程的数量。

你的总结还是有些问题的。


总结的过程中,才能有所发现,多谢。
> 32位下, 最好不要超过1280M内存。
你指的是HEAP的大小吧, 事实上我也觉得我的问题正出在此处。目前改为1000,系统还未抛出异常。
再者, 关于Linux max user processes参数, 我用的是系统默认值. 73728 我觉得足够了。
> 线程栈的最大数值, 不影响线程的数量。
线程栈和线程数在内存一定的情况下还是成反比的嗯。
5 楼 sdh5724 2010-03-21  
* 调整java thread stack:  -Xss256k   需要测试下, 基本来说是足够的. 能降低jvm内存的使用。
* 32位下, 最好不要超过1280M内存。
* 看看  ulimit -u 这个参数. 这是表示用户能拥有的线程数量。 还有OS能拥有的线程也是有限制的: thread-max
* 内存对线程数量的影响不是直接的。
* 线程栈的最大数值, 不影响线程的数量。

你的总结还是有些问题的。

4 楼 david.org 2010-03-17  
hbcui1984 写道
服务器总内存多大?如果服务器内存只有3G,给JAVA分配2G的内存的话,一样会出这个问题;
JVM启动线程消耗内存时,系统内存也同样会被消耗掉同样资源。


32位机子, 4G的内存.
> JVM启动线程消耗内存时,系统内存也同样会被消耗掉同样资源。
JVM启动一线程消耗1M内存, 实际上对于系统来说消耗了1 * 2 M?怎么理解, 还是只对于线程来说 ?
3 楼 hbcui1984 2010-03-17  
服务器总内存多大?如果服务器内存只有3G,给JAVA分配2G的内存的话,一样会出这个问题;
JVM启动线程消耗内存时,系统内存也同样会被消耗掉同样资源。
2 楼 david.org 2010-03-17  
rain2005 写道
500+的线程数,是不是设计存在问题哦。

文件存储, Hadoop的HDFS. 500的并发读取线程, 已经很低了。
1 楼 rain2005 2010-03-17  
500+的线程数,是不是设计存在问题哦。

相关推荐

    内存不足OOM java.lang.OutOfMemoryError.

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

    OutOfMemoryError_8种典型案例分享

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

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

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

    java内存溢出原因

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

    tomcat内存溢出在不同系统上各种详细的解决方案

    3. **OutOfMemoryError:Unable to create new native thread** - **原因**:这种情况通常是由于系统级别的线程资源耗尽导致的。 - **解决思路**:除了调整JVM参数外,还需要考虑操作系统层面的优化,例如增加线程...

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

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

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

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

    JVM内存溢出

    3. **OutOfMemoryError: unable to create new native thread**:这是线程栈溢出,当操作系统无法为新的Java线程分配足够的内存时抛出。这可能是因为操作系统资源限制或者JVM线程栈设置过小。可以通过`-Xss`参数来...

    教你分析9种OOM常见原因及解决方案.docx

    5. Unable to Create New Native Thread 错误 * 原因分析:JVM 向 OS 请求创建 native 线程失败 * 解决方案:增加 JVM 的堆内存空间、调整 JVM 的线程池大小、优化线程的使用 6. Requested Array Size Exceeds VM ...

    tomcat内存溢出总结(2013年)

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

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

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

    JAVA内存溢出

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

    Tomcat安装配置基础详细教程讲解.docx

    3. **无法创建新本机线程(OutOfMemoryError: unable to create new native thread)**: - **解决方法**: 此类问题可能需要同时调整操作系统和Tomcat的JVM参数。 #### 三、内存调整技巧 - **堆溢出解决方案**: - ...

    tomcat内存溢出总结

    #### 三、无法创建新的本机线程(OutOfMemoryError: unable to create new native thread) **概述**:当应用程序启动了过多的线程,超过了操作系统允许的最大线程数限制时,就会出现此类错误。 **原因分析**: 1....

Global site tag (gtag.js) - Google Analytics