java - 每个线程都有一个堆栈空间吗?

标签 java stack java-threads

如果我理解正确的话,堆栈是用于局部基元和对堆中对象的引用。那么如果您有多个线程会怎样呢?

它们是否同时共享相同的堆栈空间(但区域不同),或者 JRE 是否在线程之间切换时切换上下文并加载-卸载堆栈内容?

或者 JRE 是否为每个线程分配单独的堆栈?

最佳答案

Or does the JRE allocate separate stacks for each threads?

概念上是的。 (例如,参见 JVM spec link。)

规范的概念化如何在特定的 JVM 中实现是……实现特定的。但是,我的理解是当前一代(例如 Hotspot)JVM 将每个线程堆栈分配到操作系统请求的单独内存块中;例如使用 mmap 系统调用1

发生线程切换时,肯定不会批量复制堆栈内容。然而,线程上下文切换确实需要保存和加载寄存器,并且(间接地)额外加载内存缓存和 TLB 条目。这可能很重要……这就是为什么过多的线程上下文切换(例如由锁争用或过多的等待/通知引起)可能对性能不利。


1 - 一些 JVM 在每个堆栈段的末尾包含一个只读的“红区”页面。 (这意味着线程堆栈溢出会触发内存错误,并且 JVM 不需要在每次方法调用时显式检查堆栈溢出,这将对性能造成重大影响。)无论如何,我的理解是“红区” "页面要求使用 mmap 请求线程堆栈。

关于java - 每个线程都有一个堆栈空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30270646/

相关文章:

Java : Custom Timestamp Format : verify format to microsec precision

java - 如何从匿名内部类访问非最终变量?

java - 线程、对象状态

Java 线程对象与运行线程

java - 正确使用ProgressMonitorDialog的取消按钮、中断线程、显示进度

java - Jmeter单线程组中的多个并发用户

java - 从 c malloc 矩阵到 java 数组

python - 避免 Python 3 中的堆栈溢出

stack - 虚拟机是如何工作的?

java - 从堆栈写入文件