zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    字典--------输出有序的格式
    输出数据和数据下标的两种方法
    删除操作
    搭建RabbitMQ环境(windows)
    SpringBoot 2.x 集成 Redis
    Redis 安装
    Spring Boot 数据库操作
    默认日志Logback配置
    通过poi下载图片到word
    Spring IoC 与 AOP
  • 原文地址:https://www.cnblogs.com/davidwang/p/DWang.html
Copyright © 2011-2022 走看看