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.

  • 相关阅读:
    使用纯 CSS 实现响应式的图片显示效果
    10个帮助你快速调试和排错的小技巧
    《JavaScript 实战》:JavaScript 实现拖拽缩放效果
    周末发福利了!26个免费的HTML5模版
    程序人生的四个象限和两条主线
    50份简历设计,助你找到梦寐以求的工作
    6个重构方法可帮你提升 80% 的代码质量
    开发者必须收藏的6款源码搜索引擎
    常用的20个强大的 Sublime Text 插件
    你知道吗?.NET Framework 4.5 五个很棒的特性
  • 原文地址:https://www.cnblogs.com/davidwang/p/DWang.html
Copyright © 2011-2022 走看看