因此,根据最多 things,我在互联网络上有了一个朗读,您可以在互联网络中拥有的线程数量限制在10,000个左右。然而,在实践中,我可以创造近50万,这时我的电脑变得没有反应。(任务管理器有点滑稽-它开始声称,虽然我的16 GB内存中有99%是使用的,但使用率最高的程序只使用了大约300 MB。在一切停止响应后,风扇安静下来,磁盘访问灯只会周期性地闪烁,使我相信CPU和磁盘都没有承受沉重的负荷。)我在一次测试中等待了大约15分钟,但从未出现异常(据我所知)。
为了提高可重复性,我(也)使用了以下代码:https://github.com/jheusser/core-java-performance-examples/blob/master/src/test/java/com/google/code/java/core/threads/MaxThreadsMain.java (在这里引用):https://dzone.com/articles/java-what-limit-number-threads。但是,我确实将i的上限从100 * 1000提高到了1000 * 1000,因为它成功地创建了所有线程。在电脑冻结之前,它给出的最后一条信息之一是440,000 threads: Time to create 4,000 threads was 1.002 seconds --看起来它的平均时间是每4000秒钟2秒钟。
我正在使用Windows 10 Pro,版本1703。Java HotSpot(TM) 64位服务器VM (构建9.0.4+11,混合模式)
我知道的下一个最高线程数是大约100 k,https://stackoverflow.com/a/46697264/513038。现在,许多声称的限制在许多年前就已经给出了,但是它们是基于堆栈大小与内存之间的,16 GB RAM中有50万个线程(甚至假设所有内存都已使用),默认情况下为每个线程32 GB,这应该小于最小堆栈大小。如果这是真的,我至少会期望在正常操作期间会有更多的StackOverflowErrors。过去10年,线程系统是否悄无声息地发生了变化?(甚至在过去的几个月里:我提到的其中一个员额也是几个月前,2018年4月发布的。)
发布于 2018-07-25 23:27:13
过去10年,线程系统是否悄无声息地发生了变化?
不是的。在Linux、MacOS和Windows上,Java线程被实现为本机线程.很久以前的事了。
改变的是各种不同的操作系统调度本机线程的方式。操作系统是进行Java线程调度的地方,支持的线程数量的任何硬限制都将被强制执行。
基本上,当您尝试使用大量病理上的线程时,您的测试会尝试查看会发生什么。在Windows上,答案是它破坏了操作系统。
而且,即使它没有打破操作系统--对使用100000个线程的Java应用程序来说,很可能是这样的:
大量线程是编写实用Java应用程序的错误方法。参与者可能是更好的解决方案,也可能是ExecutorService (具有有界线程池)或ForkJoin池。这将取决于应用程序和其他因素。
简而言之,您正在运行的这些测试对设计正确的Java应用程序没有任何指导意义。对于使用大量线程的应用程序,解决方案是重写它们。
https://stackoverflow.com/questions/51528790
复制相似问题