“调用栈”和“线程栈”的区别

Posted

技术标签:

【中文标题】“调用栈”和“线程栈”的区别【英文标题】:Difference between "call stack" and "thread stack" 【发布时间】:2015-09-17 15:36:13 【问题描述】:

在 Java 多线程中,术语 call stackthread stack 之间是否存在语义差异?

【问题讨论】:

我一直认为它们是同一个东西。但我愿意让我的世界被其他观点打破。 【参考方案1】:

每个线程都有自己的调用栈,“调用栈”和“线程栈”是一回事。将其称为“线程堆栈”只是强调调用堆栈是特定于线程的。

Bill Venners calls this the Java stack:

当一个新线程启动时,Java 虚拟机会为该线程创建一个新的 Java 堆栈。如前所述,Java 堆栈将线程的状态存储在离散帧中。 Java 虚拟机只在 Java Stacks 上直接执行两个操作:压入和弹出帧。

线程当前正在执行的方法是线程的当前方法。当前方法的堆栈帧是当前帧。定义当前方法的类称为当前类,当前类的常量池就是当前常量池。在执行方法时,Java 虚拟机跟踪当前类和当前常量池。当虚拟机遇到对堆栈帧中存储的数据进行操作的指令时,它会在当前帧上执行这些操作。

当线程调用 Java 方法时,虚拟机会创建一个新帧并将其推送到线程的 Java 堆栈中。然后这个新帧成为当前帧。当方法执行时,它使用框架来存储参数、局部变量、中间计算和其他数据。

【讨论】:

【参考方案2】:

call stack 是一个stack data structure,它存储有关计算机程序的活动子例程的信息。

您所称的thread stack 是我认为是线程的私有堆栈。

这两件事本质上是一样的。他们都是stack data structures

线程的堆栈用于存储函数调用的位置,以便让return语句返回到正确的位置

由于通常只有一个重要的调用堆栈,因此人们称之为堆栈

Here 是有关堆栈的信息。

Here 是有关基于堆栈的内存分配的信息。

【讨论】:

【参考方案3】:

每个线程都有自己的堆栈,每个方法调用都使用该堆栈的一个新区域。这意味着当一个方法调用自己(递归)时,它会有一组新的局部变量。

【讨论】:

【参考方案4】:

FileWriter 抛出IOException 时,运行时系统立即停止执行try 块;正在执行的方法调用未完成。然后运行时系统开始在方法调用堆栈的顶部搜索适当的异常处理程序。 在本例中,当IOException 发生时,FileWriter 构造函数位于调用堆栈的顶部。但是,FileWriter 构造函数没有适当的异常处理程序,因此运行时系统检查方法调用堆栈中的下一个方法 — writeList 方法。 writeList 方法有两个异常处理程序:一个用于IOException,一个用于IndexOutOfBoundsException

【讨论】:

以上是关于“调用栈”和“线程栈”的区别的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程

虚拟内存[02] Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

java 内存模型 ——学习笔记

读懂IL代码

最全JMM详解——Java内存模型抽象|八种同步操作|操作规则!!!

NodeJS 在异步函数(async/await)中调用栈打印不全的问题