【问题标题】:Is there any hard limit to a number of threads in Java?Java中的线程数量是否有硬性限制?
【发布时间】:2011-07-23 04:57:15
【问题描述】:

Somesources 说,你对 Java 中的线程数量有硬性限制(比如 15k 或 30k),即使你没有操作系统上限和无限的 RAM。我还听说,在 Java 7 中,这个限制被取消了。这两种说法都是真的吗?

【问题讨论】:

  • 通过实验来弄清楚似乎是一件容易的事情。
  • @Justin Dearing:怎么样?例如,您是否有一台具有无限 RAM 的机器可以超过 212000 个线程(默认 CentOS 64 位内核最大)?每个线程的堆栈有 64k 内存,它将像 800Gbs。我没有这样的电脑;)
  • Afaik 限制由OS 设置,而不是JVM
  • 我看到这里提到的限制:paultyma.blogspot.com/2008/03/… 不知道这是不是真的。
  • 在 Windows 7 64 位、12 GB RAM 和 8 核上我无法超过 2500。

标签: java multithreading


【解决方案1】:

Java Virtual Machine Specification 没有指定线程数的限制。它们通常受到可用堆栈空间量的限制,因为每个线程都有自己的私有堆栈。 (无法分配堆栈通常会在尝试创建新线程时触发 OutOfMemory 异常。)我相信线程池和其他机制也可用于限制线程数。 (例如,Sun Java System Portal Server 使用它来限制事务的数量。)

不同的虚拟机实现可能会施加其他限制。例如,BlackBerry OS 将非系统线程限制为每个应用程序 16 个,总共 64 个。我预计其他虚拟机制造商也会施加额外的限制。我会向 VM 制造商咨询这个问题的答案。

【讨论】:

  • @Ted 然后 Paul Tuma 在这里出错:paultyma.blogspot.com/2008/03/… ?
  • 无论他是对是错,一条线都很大。您不太可能真的需要 30K 这样大小的对象来表示任何活动实体(连接、会话、用户等)。回调方案可以更好地扩展。
  • 我猜您无法了解 Integer.MAX_INT 线程,因为线程调度程序(或线程组)将线程保存在具有 int 大小字段的集合中。
  • @MeBigFatGuy 可能,是的,但是 Paul 提到的 15k 或 30k 等下限呢?
  • @Vance 好吧,这是一个理论上的问题。 “你不太可能需要 XXX”只是不能满足我对知识的贪婪;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多