我们有一个带512Mb内存的小文本框。我们想在这个框中看到我们可以用Java创建多少个线程。令我们惊讶的是,我们不能创造很多。基本上,您可以使用-Xss设置的最小堆栈大小为64k。简单的数学会告诉你64 * 7000将消耗430Mb所以我们只能将它达到大约7000个线程左右然后我们遇到了这个错误:
java.lang.OutOfMemoryError: unable to create new native thread.
这是Java的真正限制吗?每512Mb的ram我们只能挤7k左右的线程?
答案 0 :(得分:8)
使用异步IO(java nio),你不需要7k线程来支持7k客户端,处理io(5?)的几个线程就足够了。
看看Netty;)
每个客户端的一个线程是一个非常糟糕的设计。
答案 1 :(得分:3)
一旦你创建了7k线程,你就不会有任何内存来做任何有用的事情。也许您应该重新考虑应用程序的设计?
无论如何,512Mb不是很小吗?也许您可以提供有关您的应用程序或域名的更多信息?
答案 2 :(得分:2)
这不是编程语言,而是在操作系统级别。
有关它的更多阅读,适用于Windows:
答案 3 :(得分:2)
请记住,您永远无法将100%的RAM专用于运行Java线程。操作系统和其他正在运行的应用程序使用了一些RAM,这意味着您永远不会拥有完整的512 Mb。
答案 4 :(得分:1)
每个客户端会话不一定需要一个线程。如果你看一下J2EE(或JavaEE)服务器处理多个连接的方式,它会使用多种策略,包括并发,排队和交换。通常,您可以在部署时配置最大活动并发实例数和空闲超时值,以调整应用程序的性能。
答案 5 :(得分:0)
尝试将允许的最大内存-Xmx设置为较低的值,并查看是否可以增加线程数。在一个正在工作的项目中,我可以使用-Xmx512m分配大约2,5k个线程,使用-Xmx96m分配大约4k个线程。
堆越大,线程堆栈空间越小(至少根据我的经验)。