虚拟机栈和栈帧的起源和关系

背景

看《深刻理解 Java 虚拟机》这本书时,讲到 Java 虚拟机栈和栈帧的部分,不清楚为什么要创造这个概念,这个内存模型存在的目的是什么,来源是什么,书中都没有扩展开来讲清楚,而了解一个概念的起源对理解这个概念是颇有帮助。java

网上查了几篇文章都没说到这个知识背景,关于虚拟机栈和栈帧的起源,能够看这个YouTube视频:Procedures, Video 3: Stack-based languageside

该视频属于大名鼎鼎的 Hardware/Software Interface class 中的一小节,讲得至关清晰。spa

本文是结合该视频作的笔记结合本身的理解,加深印象。线程

Stack-Based Languages

目的:To make it possible to support recursion in most of the programming languages, you have to keep track of all of the recursive functions that being called. 为了实现递归调用一个方法自身,咱们须要有存储每次递归调用的方法状态等,包含:cdn

Argument;Local Variable;Return Pointer。视频

Stack Frame

Stack allocated in frames, which is called Stack Frame.blog

When we call a function, we create a new frame for it, by addressing the stack pointer to create a space (memory) for all these states.递归

State: Local Variables;Function arguments; Return infomation; Temporary space.内存

Stack-based Language 描述了一种栈语言的概念,无论是c 仍是 java 的方法都用到了栈语言。get

虚拟机栈是针对线程而言,线程里的方法对应栈中的元素--栈帧。

入栈出栈流程分析

每执行一个方法,就为这个方法建立对应的栈帧,并 push 到线程这个大容器--Java 虚拟机栈中,执行完就 pop 出栈。

方法链对应的栈帧集合

对于有多个子方法的方法来讲,至关于一个方法调用链,首先父方法开始执行,入栈,被压到底部,接着执行子方法,入栈,压到父方法顶部。若是该子方法还有本身的子方法,则同理,再将子子方法压到子方法的顶部。直到调用到方法链尾部,再挨个从最深的子方法出栈,接着再到上一层方法的出栈,直到最后父方法执行到返回语句,该方法链对应的一连串栈帧都出栈完毕。

例子

相关文章
相关标签/搜索