Java Stack

   当启动一个新的线程时,JVM会为这个线程创建一个新的JavaStack。JavaStack把线程的状态存储在离散的StackFrame中。JVM只对JavaStack执行两种操作:压入StackFrame、弹出StackFrame。

   正在被一个线程执行的方法叫做这个线程的当前方法,当前方法对应的StackFrame叫做当前StackFrame,当前方法所在的类叫做当前类,当前类的常量池叫做当前常量池。当线程执行一个方法时,JVM会追踪当前类及当前常量池。当JVM遇到操作StackFrame里的数据的指令时,就会使用当前StackFrame来执行这些指令。

   当线程调用一个方法时,JVM会创建并向这个线程的JavaStack的顶部压入一个新的StackFrame。这个新的StackFrame就变成了当前StackFrame。当这个方法被执行时,会使用当前StackFrame存储参数、本地变量、中间计算值、及其它数据。

   一个方法的执行完成有两种情况。由于正常返回而完成的叫做正常完成;由于抛出异常而完成的叫做意外完成。不管方法是正常完成还是意外完成,JVM都会从JavaStack中弹出并丢弃这个方法的StackFrame,这样,前一个方法的StackFrame就变为当前StackFrame了。

   线程的JavaStack中的数据是由此线程私自占有的。一个线程不能访问或修改另一个线程的JavaStack。正因为如此,才能不必担心多线程对Java程序中的局部变量的访问。线程调用方法时,这个方法的局部变量是存储在调用这个方法的线程的JavaStack中的StackFrame中的,只有一个线程能够访问这些局部变量:调用这个方法的线程。

   类似方法区域和堆,JavaStack和StackFrame不需要在内存中是连续的。StackFrame可以被分配到连续的栈中,或者可以被分配到堆中,或者是被分配到栈和堆的某种组合上。用于表示JavaStack和StackFrame的真实的数据结构是由实现的设计者来决定的。实现可能会允许用户可程序员指定JavaStack的初始大小、最大值最小值。

你可能感兴趣的:(jvm,java线程,JavaStack,StackFrame)