java.lang.OutOfMemoryError:无法在Windows中创建新的本机线程..recreate

时间:2019-01-14 13:05:59

标签: java multithreading

我在申请中遇到了以下问题 java.lang.OutOfMemoryError:无法创建新的本机线程

我在Windows 7 64bit中的开发环境和在Linux 64位中的部署环境。我无法在本地开发环境中重现该问题。我得到以下代码,当我在linux服务器中运行时,创建线程3993时出现了相同的错误。 ulimit -u的计数为4096。因此,我坚信不允许在接近此阈值的位置为进程/应用程序/用户创建新线程。

但是,我无法在Windows开发环境中重新创建该问题。我很好奇什么代码实际上会给我Windows中的线程阈值

public class ThreadLimitChecker
{ 
  public static void main(String[] args) 
  { 
    System.out.println("Hello World");
    int count = 0; 
    while (true) 
    {
      count++; 
      new Thread(new Runnable() 
      {
        public void run() 
        {
          try 
          {
            Thread.sleep(10000000); 
          }
          catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }).start(); 
      System.out.println("Thread #:" + count); 
    }
  }
}

预计发生异常的线程号

1 个答案:

答案 0 :(得分:5)

由于我发现这个话题也很有趣,因此我进行了一些研究。

您将在Mark Russinovich (CTO of Microsoft Azure by now) @ technet处找到以下语句:

  

与某些UNIX变体不同,Windows中的大多数资源没有固定的   上限编译到操作系统中,而是派生   他们的限制取决于我拥有的基本操作系统资源   已经覆盖。例如,进程和线程需要物理   内存,虚拟内存和池内存,因此进程数或   可以在给定Windows系统上创建的线程最终是   由这些资源之一决定,具体取决于   创建进程或线程,并首先遇到哪个约束。

因此它一直在运行,直到没有剩余资源为止。

由于ulimit或多或少是一个监视某些指标的软件,因此(当然)有一个类似的Windows工具Windows System Resource Manager(直到Windows Server 2012)(根据Wikipedia)由Hyper-V取代(自Windows Server 2008开始)。