bre*_*ine 10 java stack java-threads
如果我理解正确,堆栈是为了本地原始和对堆中对象的引用.那么如果你有多个线程会发生什么?
它们是否同时共享相同的堆栈空间(但不同的区域),或者JRE切换上下文并在线程之间切换时加载 - 卸载堆栈内容?
或者JRE是否为每个线程分配单独的堆栈?
或者JRE是否为每个线程分配单独的堆栈?
概念上是的.(例如,请参阅此JVM规范链接.)
如何在特定JVM中实现规范的概念化是......特定于实现的.但是,我的理解是当前生成(例如Hotspot)JVM将每个线程堆栈分配到从OS请求的单独的内存块中; 例如使用mmap
系统调用1.
当发生线程切换时,肯定没有批量复制堆栈内容.但是,线程上下文切换确实需要保存和加载寄存器,并且(间接地)对内存高速缓存和TLB条目进行额外加载.这可能很重要......这就是为什么过多的线程上下文切换(例如由锁争用或过度等待/通知引起)可能对性能不利.
1 - 我的回忆是,一些JVM在每个堆栈段的末尾都包含一个只读的"红区"页面.(这意味着线程堆栈溢出会触发内存错误,并且JVM不需要在每次方法调用时显式检查堆栈溢出,这将是一个重大的性能损失.)无论如何,我的理解是"红区" "页面需要使用mmap请求线程堆栈.