可以在 32 位机器上用 Java 创建的线程数

Ser*_*gio 3 java concurrency multithreading

我正在阅读Java 并发实践,但在下面的段落中有点迷失了,关于可以在 32 位机器上用 Java 创建的线程数:

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

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

Pas*_*uoq 5

图 2 32是对32 位进程地址空间大小的硬限制。“32位处理”是指每个地址用32位表示,因此最多可以有2 32个不同的地址。

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

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