【问题标题】:java.lang.OutOfMemoryError: unable to create new native thread ..recreate in windowsjava.lang.OutOfMemoryError:无法在 Windows 中创建新的本地线程 ..recreate
【发布时间】:2019-01-14 13:05:59
【问题描述】:

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

我的开发环境是windows 7 64bit,部署环境是linux 64bit。我无法在本地开发环境中重现该问题。我得到了以下代码,当我在 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); 
    }
  }
}

期望发生异常的线程号

【问题讨论】:

标签: java multithreading


【解决方案1】:

因为我发现这个话题也很有趣,所以我做了一些研究。

你会发现Mark Russinovich (CTO of Microsoft Azure by now) @ technet的以下声明:

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

所以它会一直运行,直到没有剩余资源为止。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多