Thinking after meet OOM: Can not create new native thread.

What caused this exception?
1) Too many threads was created in application.
2) JVM configuration limit the thread number.

Our coding seems good, we have done some improvement for multi-threads, e.g. using thread pool and make a suitable thread number, so ignore reason 1.

It is needed to investigated the effects of memory different setting for my application.
Here are some concepts.
Max process Memory: Max memory of one process.(Different system JVM version have different size. e.g. Windows 32bit 2GB, windows 64bit 4GB, Redhat 32bit 2GB, Redhat 64bit 3GB, Solaris 4GB)
JVM Memory: Heap(Configured by -Xms & -Xmx) + PermGen(Configured by -XX:PermSize & -XX:MaxPermSize)
Reserved OS Memory: Native Heap, JNI
Thread Stack Size: One thread used memory size.(Changed by -Xss, this value too small may cause StackOverFlow)

When create a new thread in JAVA, JVM would create a new thread object and one system thread.
The memory of the system thread do not use JVM Memory, it would use the memory of (MaxProcessMemory - JVMMemory - ReservedOSMemory).

Number of threads =(MaxProcessMemory - JVMMemory - ReservedOSMemory)/(ThreadStackSize)

So, if you give more memory for JVM would cause the program can create less threads.

 

 1 public class DeamonThread extends Thread {
 2 
 3     CountObject obj = new CountObject();
 4     
 5     public DeamonThread(){
 6         this.setDaemon(true);
 7     }
 8     
 9     @Override
10     public void run() {
11         try {
12             synchronized (obj) {
13                 obj.wait();
14             }
15         } catch (InterruptedException e) {
16             e.printStackTrace();
17         }
18     }
19 
20 
21 }

 

 1 public class MaxThreadTest {
 2     public static void main(String[] args) {
 3         int i = 0;
 4         try{
 5             while(true){
 6                 System.out.println("Thread count:"+i++);
 7                 new DeamonThread().start();
 8             }
 9         }catch(Error e){
10             System.out.println(e.getMessage());
11             System.out.println("Thread count="+i);
12         }
13     }
14 }

 


Test result:

ENV(Local computer):

Windows 7 32bit, 4G memory, 4 core CPU. JRE 6 32bit version.

 

run "java  src.com.ai.thread.MaxThreadTest" without options can create total 4976 threads.
run "java -Xss1024k src.com.ai.thread.MaxThreadTest" can create total 1588 threads.
run "java -Xss512k src.com.ai.thread.MaxThreadTest" can create total 3182 threads.
run "java -Xss256k src.com.ai.thread.MaxThreadTest" can create total 6201 threads.


run "java -Xss256k -Xms1024m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 3230 threads.
run "java -Xss256k -Xms512m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 3230 threads.
run "java -Xss256k -Xms512m -Xmx512m src.com.ai.thread.MaxThreadTest" can create total 5188 threads.
run "java -Xss256k -Xms256m -Xmx256m src.com.ai.thread.MaxThreadTest" can create total 6201 threads.


run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total  2534   threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total 2534    threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=512M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" throw Error "Could not reserve enough space for object heap".

run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m src.com.ai.thread.MaxThreadTest" can create total 3009    threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total 2534    threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=512m src.com.ai.thread.MaxThreadTest" throw Error "Could not reserve enough space for object heap".

========================================================

Test result:
ENV(Production): Windows server 2008 R2 64bit, 32G memory, 16 core CPU. JRE 6 32bit version.

run "java  src.com.ai.thread.MaxThreadTest" without options can create total 2702 threads.
run "java -Xss1024k src.com.ai.thread.MaxThreadTest" can create total 1240 threads.
run "java -Xss512k src.com.ai.thread.MaxThreadTest" can create total 2038 threads.
run "java -Xss256k src.com.ai.thread.MaxThreadTest" can create total 3032 threads.


run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total 1532 threads.
run "java -Xss256k -Xms512m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 1532 threads.
run "java -Xss256k -Xms512m -Xmx512m src.com.ai.thread.MaxThreadTest" can create total 2535 threads.
run "java -Xss256k -Xms256m -Xmx256m src.com.ai.thread.MaxThreadTest" can create total 3032 threads.

run "java -Xms1024m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 1377 threads.
run "java -Xss1024k -Xms1024m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 632 threads.
run "java -Xss512k -Xms1024m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 1050 threads.
run "java -Xss256k -Xms1024m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 1532 threads.
run "java -Xss128k -Xms1024m -Xmx1024m src.com.ai.thread.MaxThreadTest" can create total 2031 threads.

 

run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total  1185   threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total 1185    threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=512M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total 689     threads.

run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m src.com.ai.thread.MaxThreadTest" can create total 1405    threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m src.com.ai.thread.MaxThreadTest" can create total 1185    threads.
run "java -Xss256k -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=512m src.com.ai.thread.MaxThreadTest" can create total 689     threads.

 

So if the Max process Memory is fixed, can get the bellow result:

1. More stack size would make JVM less threads available.

2. More heap size would make JVM less threads available.

3. More Permanent space size make JVM less threads available.

 

Anyway if you are using 64bit system, should use 64bit JVM version and you can get more efficiency.

转载于:https://www.cnblogs.com/davidwang/archive/2012/11/21/DWang.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值