Java对最大线程数有很大限制吗?

11
我们有一个只有512Mb内存的小文本框。我们想尝试在Java中创建多少个线程。令我们惊讶的是,我们无法创建太多线程。基本上,您可以使用-Xss设置的最小堆栈大小为64k。简单的数学运算告诉你,64*7000将消耗430Mb,所以我们只能将它提高到大约7000个线程左右,然后遇到了这个错误:
java.lang.OutOfMemoryError: unable to create new native thread. 

Java的确存在这个限制吗?每512Mb内存只能容纳大约7k个线程?


1
你真的需要那么多线程吗?这台机器有多少个 CPU/核心? - Bwmat
我们计划支持许多客户端。它托管在虚拟云上,所以不确定。 - erotsppa
18
如果你需要7,000个本地线程,那么你的应用程序存在严重的设计缺陷。 - Jason Coco
4
这就是为什么要创建连接池。 - Gnoupi
4
复用 I/O,不要只是创建无限制的线程,或重新考虑协议设计并优先选择非持久连接。 - Jason Coco
显示剩余3条评论
6个回答

8
使用异步IO(Java NIO),您无需使用7k个线程来支持7k个客户端,只需要几个处理IO的线程(5个?)就足够了。
请看Netty ;) 为每个客户端使用一个线程是一个非常糟糕的设计。

nio线程数量还有限制吗?我现在正在处理一个第三方库,它似乎创建了数千个线程,但它使用的是nio...似乎引起了OP描述的相同错误... - Daniel Gruszczyk

3

一旦您创建了7k个线程,您将没有任何内存来执行任何有用的操作。也许您应该重新考虑应用程序的设计?

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


2

在这个人的情况下,他们在达到内核限制之前就达到了内存限制。 - Jason Coco
@Jason - 确实,我在路上错过了“OutOfMemoryError”。 - Gnoupi
3
我认为,“OutOfMemoryError: unable to create new native thread”错误可能是由于操作系统的每个进程线程限制造成的,尽管它是一种内存溢出错误。不过我并不完全确定。 - ColinD
2
其实@ConlinD是对的,进程限制也会显示为内存不足错误。 - Jason Coco

2

请注意,您永远无法将所有RAM都用于运行Java线程。由于操作系统和其他正在运行的应用程序使用了一些RAM,因此您将永远无法使用全部512 Mb可用内存。


1

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


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接