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
    评论
出现"java.lang.OutOfMemoryError: unable to create new native thread"错误通常是由于应用程序请求第三方系统资源时内存不足所导致的。这个错误可能发生在应用程序尝试创建新的本机线程,但无法分配足够的内存来支持新线程的情况下。这通常是由于操作系统的限制或者应用程序本身的资源管理问题所引起的。 在处理这个问题时,有几个可能的解决方案可以尝试: 1. 调整操作系统的线程限制:如果操作系统对线程数有限制,并且应用程序达到了这个限制,可以尝试增加操作系统的线程限制。这可以通过修改操作系统的配置文件来实现。 2. 优化应用程序的资源管理:检查应用程序的代码和配置,确保合理地使用和释放资源。特别注意确保关闭和释放不再使用的线程和连接,以避免资源泄漏。 3. 调整应用程序的线程池配置:如果应用程序使用了线程池来管理线程,可以尝试调整线程池的配置,如增加线程池的最大线程数或者使用不同的线程池实现。例如,如果应用程序使用的是newCachedThreadPool,可能会导致线程数无限制增长,从而导致内存不足。可以考虑使用固定大小的线程池来限制线程数。 4. 分析应用程序的线程使用情况:使用工具分析应用程序的线程使用情况,找出是否有线程泄漏或者线程过多的情况。可以使用工具如jstack、jvisualvm等来生成线程转储并进行分析。 综上所述,当出现"java.lang.OutOfMemoryError: unable to create new native thread"错误时,可以尝试调整操作系统的线程限制、优化应用程序的资源管理、调整应用程序的线程池配置或者分析应用程序的线程使用情况来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [问题分析:java.lang.OutOfMemoryError unable to create new native thre](https://download.csdn.net/download/weixin_35823099/86281250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【内存溢出系列】OutOfMemoryError:Java heap space(1/8)](https://blog.csdn.net/weixin_31966453/article/details/114324660)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [由于不知道Java线程池的bug,某程序员叕被祭天](https://blog.csdn.net/qq_33589510/article/details/109549716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值