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

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

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

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

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

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

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

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

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

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

  • Windows是否每个进程限制2000个线程?
  • 推动Windows的局限:进程和线程 (作者:Mark Russinovich)

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

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

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

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