【问题标题】:Number of threads that can be created in Java in 32 bits machines在 32 位机器上可以用 Java 创建的线程数
【发布时间】:2015-03-04 05:53:36
【问题描述】:

我正在阅读Java concurrency in Practice,在下面的段落中有点迷失了,关于可以在 Java 中在 32 位机器中创建的线程数:

在 32 位机器上,一个主要的限制因素是地址空间 线程堆栈。每个线程维护两个执行堆栈,一个用于 Java 代码和一个本地代码。典型的 JVM 默认值会产生 组合堆栈大小约为半兆字节。 (你可以改变这个 使用 -Xss JVM 标志或通过 Thread 构造函数。)如果 你将每个线程的堆栈大小分成 232,你得到一个 限制为几千或几万个线程。 其他因素(例如操作系统限制)可能会施加更严格的限制。

这是什么意思? 232 数从何而来?如果 Thread 类中没有将堆栈大小作为参数的构造函数,我如何更改 Thread 构造函数中的堆栈大小?

【问题讨论】:

  • 2^32 值是可用虚拟地址空间的大小。
  • 您所说的 232 实际上是 2^32。现在这个错字已经修正,您还有疑问吗?
  • 哦,我的上帝,在我的 pdf 中,它被读作 232,感谢您纠正错字! :)
  • 该段的语法似乎被破坏了。我同意它的解释,“如果你将理论上的最大地址空间除以最小堆栈大小,那么......”(但是从技术上讲,当你考虑段时,这是不正确的)。尽管如此,拥有这么多线程还是个坏主意。

标签: java multithreading concurrency


【解决方案1】:
  1. 有一个constructor将堆栈大小作为参数。

  2. 2^32是虚拟地址空间的大小。

【讨论】:

    【解决方案2】:

    图232是对32位进程address space大小的硬性限制。 “32位进程”是指每个地址用32位表示,因此最多可以有232个不同的地址。

    段落是说,由于每个线程必须为线程的堆栈保留大约 512 * 1024 个地址,因此由于地址数量有限,因此只能有这么多线程。

    请注意,232 是理论上的定义限制。在实践中,如果操作系统将其中的 3/4 提供给 32 位进程,您可能会认为自己很幸运。

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 2012-10-08
      • 1970-01-01
      • 2013-06-13
      • 2011-01-14
      • 2012-11-07
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多