java.lang.OutOfMemoryError: unable to create new native thread

以前关注OutOfMemoryError比较多的是tuning heap size以及里面各个部分的比例,今天遇到如题的这么一个问题,折腾了一番,虽然找到了解决方案,调整Xss的大小,但是原因一直没弄明白,所以花了点时间找了一下原因,大致是明白了:

 

首先我们要知道有哪些可能会导致OutOfMemoryError,这就要看jvm的规范了:

http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html


其中说得很明白,在JVM的Runtime Data Areas里包括以下几块:

The pc Register

Java Virtual Machine Stacks

Heap

Method Area

Runtime Constant Pool

Native Method Stacks

每一块如果获得不了足够的内存,都有可能抛出OutOfMemoryError。如题的问题就是由于Native Method Stacks内存不足。

http://confluence.atlassian.com/display/FISHEYE/Fix+Out+of+Memory+errors+by+increasing+available+memory

 

那接下来就是分析造成内存不足的原因了:

首先,因为分配给单个JVM的内存总数是有限制的,比如32位的Windows上为2GB。

(Managed Heap + native heap + (thread stack size * number of threads)) cannot exceed 2GB on 32bit x86 Windows or Linux systems.


接下来,最大的heap size又是有规定的——1600m,这就是Xmx不能香舌多大就能设多大的原因。而Heap又是由几个不同部分组成的,所以如何调节每个部分的比例也是有讲究的。(常用的参数有Xms,Xmx,Xmn等)

 

除了heap size,这2G的内存还要被其它部分使用,比如Native Method Stacks,所以如果出现如题的error,有两个思路去解决:

1、是将heap size适当调小,这样2GB中总够能够分配给Native Method Stacks就大

2、调节Xss参数,这个参数的意思是the stack size for each thread。如果将这个参数适当减少(在32位的windows下缺省为320k——Java SE6),在保持thread stack size * number of threads不变的情况下,number of threads就能够增加了。

 

http://wiki.alfresco.com/wiki/JVM_Tuning

http://java.sun.com/performance/reference/whitepapers/tuning.html#section4.1.2

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值