Kau*_*hik 2 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
预期发生异常的线程号
由于我发现该主题也很有趣,因此进行了一些研究。
您将在Technet上找到Mark Russinovich(现为Microsoft Azure的CTO)的以下声明:
与某些UNIX变体不同,Windows中的大多数资源没有固定的上限被编译到操作系统中,而是根据我已经介绍的基本操作系统资源得出其限制。例如,进程和线程需要物理内存,虚拟内存和池内存,因此可以在给定Windows系统上创建的进程或线程的数量最终由这些资源之一确定,具体取决于进程的方式或创建线程,并首先遇到哪个约束。
因此,它一直在运行,直到没有剩余资源为止。
由于ulimit或多或少是一个监视某些指标的软件,因此(当然)有一个类似的Windows工具Windows System Resource Manager(直到Windows Server 2012)(根据Wikipedia)已由Hyper-V取代(自Windows Server 2008)。
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |