背景
看《深入理解 Java 虚拟机》这本书时,讲到 Java 虚拟机栈和栈帧的部分,不清楚为何要创造这个概念,这个内存模型存在的目的是什么,来源是什么,书中都没有扩展开来说清楚,而了解一个概念的起源对理解这个概念是很有帮助。
网上查了几篇文章都没说到这个知识背景,关于虚拟机栈和栈帧的起源,可以看这个YouTube视频:Procedures, Video 3: Stack-based languages
该视频属于大名鼎鼎的 Hardware/Software Interface class 中的一小节,讲得相当清晰。
本文是结合该视频做的笔记结合自己的理解,加深印象。
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. 为了实现递归调用一个方法自身,我们需要有存储每次递归调用的方法状态等,包含:
Argument;Local Variable;Return Pointer。
Stack Frame
Stack allocated in frames, which is called Stack Frame.
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 的方法都用到了栈语言。
虚拟机栈是针对线程而言,线程里的方法对应栈中的元素--栈帧。
入栈出栈流程分析
每执行一个方法,就为这个方法创建对应的栈帧,并 push 到线程这个大容器--Java 虚拟机栈中,执行完就 pop 出栈。
方法链对应的栈帧集合
对于有多个子方法的方法来说,相当于一个方法调用链,首先父方法开始执行,入栈,被压到底部,接着执行子方法,入栈,压到父方法顶部。如果该子方法还有自己的子方法,则同理,再将子子方法压到子方法的顶部。直到调用到方法链尾部,再挨个从最深的子方法出栈,接着再到上一层方法的出栈,直到最后父方法执行到返回语句,该方法链对应的一连串栈帧都出栈完毕。