问题 Java的最大线程数非常有限?


我们有一个带512Mb内存的小文本框。我们想在这个框中看到我们可以用Java创建多少个线程。令我们惊讶的是,我们不能创造很多。基本上,您可以使用-Xss设置的最小堆栈大小为64k。简单的数学会告诉你64 * 7000将消耗430Mb所以我们只能将它达到大约7000个线程左右然后我们遇到了这个错误:

java.lang.OutOfMemoryError: unable to create new native thread. 

这是Java的真正限制吗?每512Mb的ram我们只能挤7k左右的线程?


11636
2017-07-05 16:32


起源

你真的需要那么多线程吗?机器有多少cpus / core? - Bwmat
我们计划支持许多客户。它托管在虚拟云上,所以不确定。 - erotsppa
如果您需要7000个本机线程,则您的应用程序中存在严重的设计缺陷。 - Jason Coco
@erotsppa - 这就是你创建连接池的原因。 - Gnoupi
@erotsppa:复用io,不要只是创建无界线程或重新考虑你的协议设计,而是选择非持久连接。 - Jason Coco


答案:


使用异步IO(java nio),你不需要7k线程来支持7k客户端,处理io(5?)的几个线程就足够了。
看一眼 网状 ;)

每个客户端的一个线程是一个非常糟糕的设计。


8
2017-07-05 17:52



nio线程的数量是否还有限制?我正在处理第三方库,现在似乎正在创建数千个线程,它正在使用nio tho ...似乎导致OP描​​述的相同错误... - Daniel Gruszczyk


一旦你创建了7k线程,你就不会有任何内存来做任何有用的事情。也许您应该重新考虑应用程序的设计?

无论如何,512Mb不是很小吗?也许您可以提供有关您的应用程序或域名的更多信息?


3
2017-07-05 17:48





它不是编程语言,而是在操作系统级别上。

有关它的更多内容,适用于Windows:


2
2017-07-05 16:35



在这个人的情况下,他们在达到内核限制之前就达到了内存限制。 - Jason Coco
@Jason - 的确,我在路上错过了“OutOfMemoryError”。 - Gnoupi
我相信“OutOfMemoryError:无法创建新的本机线程” 能够 尽管是OutOfMemoryError,但是由OS的每进程线程限制引起。虽然不是100%肯定。 - ColinD
实际上@ConlinD是正确的,进程限制也显示为内存不足错误。 - Jason Coco


请记住,您永远无法将100%的RAM专用于运行Java线程。操作系统和其他正在运行的应用程序使用了一些RAM,这意味着您永远不会拥有完整的512 Mb。


2
2017-07-05 16:35





每个客户端会话不一定需要一个线程。如果你看一下J2EE(或JavaEE)服务器处理多个连接的方式,它会使用多种策略,包括并发,排队和交换。通常,您可以在部署时配置最大活动并发实例数和空闲超时值,以调整应用程序的性能。


1
2017-07-05 22:15





尝试将允许的最大内存-Xmx设置为较低的值,并查看是否可以增加线程数。在工作中的项目中,我可以使用-Xmx512m分配大约2,5k个线程,使用-Xmx96m分配大约4k个线程。

堆越大,线程堆栈空间越小(至少根据我的经验)。


0
2017-07-05 16:39